Ayuda con memoria dinamica

Iniciado por d00ze13, 23 Mayo 2014, 23:15 PM

0 Miembros y 1 Visitante están viendo este tema.

d00ze13

A ver si alguien me puede ayudar con una cosa que me he atascado de memoria dinámica.

Código (cpp) [Seleccionar]

typedef struct {
string nombre;
int edad;
}tDatos;
typedef tDatos *tDatosPtr;

typedef struct {
int cont;
tDatosPtr datos;
}tLista;

int main() {
tLista lista;
lista.cont = 0;
lista.datos = new tDatos[10];

tDatosPtr datosPersona = new tDatos;
datosPersona->nombre = "pepe";
datosPersona->edad = 12;

//Aqui está el error, por que no me deja asignar?
lista.datos[0] = datosPersona;
lista.cont++;

delete[] lista.datos;

return 0;
}

eferion

En C++ no hace falta usar los typedef para las estructuras:

El siguiente código en C++...
Código (cpp) [Seleccionar]

struct tDatos
{
string nombre;
int edad;
};


... es equivalente a tu versión en C:


struct {
string nombre;
int edad;
}tDatos;


No es un fallo, pero el código tiene menos basura y eso se agradece ;)

El fallo te da porque tu has declarado lista.datos como un puntero... no como un array de punteros.

La siguiente instrucción sí sería válida:

Código (cpp) [Seleccionar]
lista.datos = datosPersona;

Aún así, si lo que quieres es almacenar una lista de punteros, puedes usar mejor un contenedor de C++.

El más común es std::vector:

Código (cpp) [Seleccionar]

struct tLista
{
  std::vector< tDatosPtr > datos;
};

int main( )
{
  tLista lista;
 
  tDatosPtr datosPersona = new tDatos;
  datosPersona->nombre = "pepe";
  datosPersona->edad = 12;

  lista.datos.push_back( datosPersona );
  int numero_elementos = lista.datos.size( ); 
};


La otra opción es declarar lista.datos como un puntero doble:

Código (cpp) [Seleccionar]

struct tLista{
int cont;
tDatosPtr* datos;
};

d00ze13

Muchas gracias!!

Otra duda ya la última, si tengo esta estructura de datos dentro de otra creada con new para memoria dinámica el nombre y array de tDatos también estarían en el Heap no?

Código (cpp) [Seleccionar]

typedef struct {
string nombre;
int array[100];
}tDatos;

typedef struct {
int cont;
tDatos datos;
}tLista;

int main() {
tLista *lista = new tLista[10];

delete[] lista;

return 0;
}

eferion

Efectivamente.

Al crear un elemento nuevo con 'new', todo su contenido se crea en el heap, si se almacenase algo en el stack tendrías un problema porque esa información acabaría desapareciendo al salir del ámbito que le corresponda. Lo que está en el heap sólo desaparece cuando usas delete.

Un saludo.