elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda con memoria dinamica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda con memoria dinamica  (Leído 2,302 veces)
d00ze13

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Ayuda con memoria dinamica
« 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.  


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con memoria dinamica
« Respuesta #1 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. };


En línea

d00ze13

Desconectado Desconectado

Mensajes: 78


Ver Perfil
Re: Ayuda con memoria dinamica
« Respuesta #2 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.  
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Ayuda con memoria dinamica
« Respuesta #3 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.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda asignacion de memoria dinámica palabras en c « 1 2 3 »
Programación C/C++
newfag 24 13,875 Último mensaje 19 Mayo 2010, 20:42 pm
por Eternal Idol
Memoria dinámica
Programación C/C++
eleon 6 5,116 Último mensaje 24 Enero 2012, 22:17 pm
por Eternal Idol
Ayuda! Por favor. Tengo problema con memoria dinámica en c++ y función getline
Programación C/C++
DeathStar92 0 2,314 Último mensaje 25 Noviembre 2012, 19:56 pm
por DeathStar92
Ayuda con declaracion de memoria dinamica en funcion « 1 2 »
Programación C/C++
Roga 11 6,009 Último mensaje 27 Junio 2017, 06:51 am
por MAFUS
Ayuda con memoria dinamica
Programación C/C++
mari2diaz 1 2,658 Último mensaje 10 Febrero 2020, 11:18 am
por MAFUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines