Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d00ze13 en 23 Mayo 2014, 23:15 pm



Título: Ayuda con memoria dinamica
Publicado por: d00ze13 en 23 Mayo 2014, 23:15 pm
A ver si alguien me puede ayudar con una cosa que me he atascado de memoria dinámica.

Código
  1. typedef struct {
  2. string nombre;
  3. int edad;
  4. }tDatos;
  5. typedef tDatos *tDatosPtr;
  6.  
  7. typedef struct {
  8. int cont;
  9. tDatosPtr datos;
  10. }tLista;
  11.  
  12. int main() {
  13. tLista lista;
  14. lista.cont = 0;
  15. lista.datos = new tDatos[10];
  16.  
  17. tDatosPtr datosPersona = new tDatos;
  18. datosPersona->nombre = "pepe";
  19. datosPersona->edad = 12;
  20.  
  21. //Aqui está el error, por que no me deja asignar?
  22. lista.datos[0] = datosPersona;
  23. lista.cont++;
  24.  
  25. delete[] lista.datos;
  26.  
  27. return 0;
  28. }
  29.  


Título: Re: Ayuda con memoria dinamica
Publicado por: eferion en 24 Mayo 2014, 00:18 am
En C++ no hace falta usar los typedef para las estructuras:

El siguiente código en C++...
Código
  1. struct tDatos
  2. {
  3. string nombre;
  4. int edad;
  5. };

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

Código
  1. struct {
  2. string nombre;
  3. int edad;
  4. }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
  1. 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
  1. struct tLista
  2. {
  3.  std::vector< tDatosPtr > datos;
  4. };
  5.  
  6. int main( )
  7. {
  8.  tLista lista;
  9.  
  10.  tDatosPtr datosPersona = new tDatos;
  11.  datosPersona->nombre = "pepe";
  12.  datosPersona->edad = 12;
  13.  
  14.  lista.datos.push_back( datosPersona );
  15.  int numero_elementos = lista.datos.size( );  
  16. };

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

Código
  1. struct tLista{
  2. int cont;
  3. tDatosPtr* datos;
  4. };


Título: Re: Ayuda con memoria dinamica
Publicado por: d00ze13 en 24 Mayo 2014, 00:36 am
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
  1. typedef struct {
  2. string nombre;
  3. int array[100];
  4. }tDatos;
  5.  
  6. typedef struct {
  7. int cont;
  8. tDatos datos;
  9. }tLista;
  10.  
  11. int main() {
  12. tLista *lista = new tLista[10];
  13.  
  14. delete[] lista;
  15.  
  16. return 0;
  17. }
  18.  


Título: Re: Ayuda con memoria dinamica
Publicado por: eferion en 24 Mayo 2014, 10:02 am
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.