Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: eleon en 24 Enero 2012, 20:07 pm



Título: Memoria dinámica
Publicado por: eleon en 24 Enero 2012, 20:07 pm
Buenas noches:

Os escribo para ver si me podéis resolver una dudilla: estoy trabajando con los punteros y la memoria dinámica, ya he visto cómo asignar memoria en tiempo de ejecución del Free Store con "new", liberarla antes de volver a usar el puntero con "delete", los riesgos que conlleva, etc.

Pero se me ha ocurrido una cosa un poco más compleja: ejecutar condicionales que vayan asignando memoria de forma indefinida (por ejemplo para una agenda, que se reserve memoria cada vez que se quiera añadir una persona de tal forma que podamos añadir tanta gente como queramos, u otro tipo de base de datos).

Bastaría con hacer algo asi como:

Código
  1. if (opcion == 4) //La cuarta opcion por poner algo es "añadir alguien a la agenda"
  2. {
  3. personas *puntero = new personas; //La clase "personas" contendría los distitnos datos de cada persona añadida a la agenda
  4. }

El caso es que, al querer añadir un nuevo usuario, con "personas *puntero = new personas" perdería el usuario anterior que hemos guardado.

Mi pregunta de forma concisa: ¿cómo se podría hacer para no perder las direcciones de las zonas de memoria a las que ha ido apuntando un puntero y asi poder volver a ellas?. Guardarlas en una tabla no tiene sentido ya que la tabla es finita.

Gracias y saludos.


Título: Re: Memoria dinámica
Publicado por: satu en 24 Enero 2012, 20:51 pm
Hola

Para almacenar tantos datos como quieras puedes utilizar una lista (http://es.wikipedia.org/wiki/Lista_(inform%C3%A1tica)), una cola, pila, etc.

Busca sobre estas estructuras de datos, hay mucha info y ejemplos en el foro.

Saludos


Título: Re: Memoria dinámica
Publicado por: eleon en 24 Enero 2012, 21:53 pm
Me he interesado por las listas y he entendido la estructura:

Creamos un nuevo tipo/estructura compuesto por el dato y una referencia al siguiente nodo, además creamos un tipo/estructura que solo usaríamos una vez para tener siempre a la vista el primer elemento; en el link que me has pasado está en notación algorítmica asi que en c++ sería algo asi:

Código
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class nodo
  5. {
  6.    public:
  7.        nodo(){pSiguiente = new nodo;}; //Constructor
  8.        ~nodo(){};                     //Destructor
  9.  
  10.        int dato;                      //Dato a almacenar en este nodo
  11.        nodo *pSiguiente;              //Referencia al siguiente nodo
  12. };
  13.  
  14. class primerElemento
  15. {
  16.    public:
  17.        nodo primerNodo;
  18. };
  19.  
  20. int main ()
  21. {
  22.    primerElemento objeto;
  23.  
  24.    cin;
  25.    return 0;
  26. }
  27.  

El compilador no me da ningún error y después de darle 287287 vueltas y entenderlo a la perfección creo que he conseguido seguir minuciosamente la filosofía de la lista.

Ahora, para acceder al dato del primer nodo sería:

Código
  1. objeto.primerNodo.dato = 5;

¿Y ahora para acceder al siguiente nodo?, de todas formas seguro que hay algo que se me escapa puesto que no es posible que se necesite escribir "1ºnodo.2ºnodo.3ºnodo.4ºnodo...". ¿Podéis darme alguna indicación acerca de esto?.

Gracias, saludos.

EDITO: En esta página parece que lleva la cuenta del índice del nodo al que quiere acceder: http://c.conclase.net/edd/?cap=001f#1_9

¿Pero cómo se colocaría el índice en el código?, no lo veo por ningún lado :S


Título: Re: Memoria dinámica
Publicado por: durasno en 24 Enero 2012, 21:54 pm
Como dice satu te combiene revisar que son las listas, como se emplean y todo con respecto a listas. Para empezar te recomiendo que busques "Listas enlazadas simples"


Título: Re: Memoria dinámica
Publicado por: eleon en 24 Enero 2012, 21:57 pm
Como dice satu te combiene revisar que son las listas, como se emplean y todo con respecto a listas. Para empezar te recomiendo que busques "Listas enlazadas simples"

Eso he hecho compañero, mi duda no es acerca del funcionamiento general de una lista sino algo puntual; una vez que tengo creada la lista cómo acceder a cada uno de los nodos.

Miraré lo que me has indicado y comento gracias.


Título: Re: Memoria dinámica
Publicado por: armizh en 24 Enero 2012, 22:13 pm
Pues sobre tu código inicial puedo decir que eso es tan facil como aumentar la direccion del puntero. No estoy seguro como se hace en C++ pero en C se agrega ++ luego del puntero. Ya que se puede mezclar C con C++ tal vez funcione lo siguiente.

Código
  1. if (opcion == 4) //La cuarta opcion por poner algo es "añadir alguien a la agenda"
  2. {
  3. personas *puntero = new personas; //La clase "personas" contendría los distitnos datos de cada persona añadida a la agenda
  4. *puntero++ //Así aumentamos la posicion actual del puntero para que luego la siguiente clase que crees vaya
  5.                 //a la siguiente posición y no se sobreescriban los datos
  6. }
Pero recalco, no se exactamente como se hace en C++ pero si tu compilador soporta la mezcla entre C y C++ esto deberia funcionar.

Saludos


Título: Re: Memoria dinámica
Publicado por: Eternal Idol en 24 Enero 2012, 22:17 pm
eleon: con un puntero vas accediendo al miembro que apunta al siguiente elemento, en cualquier libro podes encontrar esto muy bien explicado y con ejemplos. Mejor uno de papel pero sino en el foro tenes muchos: http://foro.elhacker.net/programacion_cc/librospapers_cc-t296234.0.html

armizh: ¿De verdad pensas que en C++ no se incrementa con ++? ¿A donde te crees que apunta puntero? Memoria invalida, solo se reservo espacio para un objeto.