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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Memoria dinámica
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Memoria dinámica  (Leído 5,070 veces)
eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Memoria dinámica
« 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.


« Última modificación: 24 Enero 2012, 20:35 pm por eleon » En línea

satu


Desconectado Desconectado

Mensajes: 301

Siempre aprendiendo


Ver Perfil WWW
Re: Memoria dinámica
« Respuesta #1 en: 24 Enero 2012, 20:51 pm »

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


En línea

Breakbeat como forma de vida
eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Re: Memoria dinámica
« Respuesta #2 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
« Última modificación: 24 Enero 2012, 21:56 pm por eleon » En línea

durasno


Desconectado Desconectado

Mensajes: 373


Ver Perfil
Re: Memoria dinámica
« Respuesta #3 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"
En línea

Ahorrate una pregunta, lee el man
eleon

Desconectado Desconectado

Mensajes: 99


Ver Perfil
Re: Memoria dinámica
« Respuesta #4 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.
« Última modificación: 24 Enero 2012, 21:59 pm por eleon » En línea

armizh

Desconectado Desconectado

Mensajes: 187

His brain caught in a hole...


Ver Perfil WWW
Re: Memoria dinámica
« Respuesta #5 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
En línea

Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código
  1. git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código
  1. git clone https://github.com/armizh/Hamster
Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Memoria dinámica
« Respuesta #6 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.
« Última modificación: 24 Enero 2012, 22:18 pm por Eternal Idol » En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problemas con manejo de memoria dinamica
Java
Legnak 0 2,149 Último mensaje 3 Febrero 2012, 17:51 pm
por Legnak
Cómo comparar 2 variables en memoria dinamica?
.NET (C#, VB.NET, ASP)
luison 0 1,925 Último mensaje 19 Marzo 2012, 20:57 pm
por luison
Memoria dinamica matriz
Programación C/C++
programacion_c 1 3,021 Último mensaje 25 Abril 2012, 00:23 am
por david_BS
[pregunta] memoria dinamica , estandar vs api de windows
Programación C/C++
daryo 2 2,202 Último mensaje 9 Julio 2013, 02:06 am
por rir3760
Problemas de perdida de memoria con memoria dinamica
Programación C/C++
ing_maipu 1 2,324 Último mensaje 28 Octubre 2017, 18:48 pm
por CalgaryCorpus
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines