Memoria dinámica

Iniciado por eleon, 24 Enero 2012, 20:07 PM

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

eleon

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 (cpp) [Seleccionar]
if (opcion == 4) //La cuarta opcion por poner algo es "añadir alguien a la agenda"
{
personas *puntero = new personas; //La clase "personas" contendría los distitnos datos de cada persona añadida a la agenda
}


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.

satu

Hola

Para almacenar tantos datos como quieras puedes utilizar una lista, una cola, pila, etc.

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

Saludos
Breakbeat como forma de vida

eleon

#2
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 (cpp) [Seleccionar]
#include <iostream>
using namespace std;

class nodo
{
   public:
       nodo(){pSiguiente = new nodo;}; //Constructor
       ~nodo(){};                     //Destructor

       int dato;                      //Dato a almacenar en este nodo
       nodo *pSiguiente;              //Referencia al siguiente nodo
};

class primerElemento
{
   public:
       nodo primerNodo;
};

int main ()
{
   primerElemento objeto;

   cin;
   return 0;
}


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 (cpp) [Seleccionar]
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

durasno

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"
Ahorrate una pregunta, lee el man

eleon

#4
Cita de: 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"

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.

armizh

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.

if (opcion == 4) //La cuarta opcion por poner algo es "añadir alguien a la agenda"
{
personas *puntero = new personas; //La clase "personas" contendría los distitnos datos de cada persona añadida a la agenda
*puntero++ //Así aumentamos la posicion actual del puntero para que luego la siguiente clase que crees vaya
                 //a la siguiente posición y no se sobreescriban los datos
}

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
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

Eternal Idol

#6
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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón