Título: Duda con punteros Publicado por: SrMcLister en 1 Junio 2018, 19:15 pm Buenas a tod@s!!
Tengo una pregunta ya que he estado cursando hasta hace poco la asignatura de Programación y Estructura de datos, y en las prácticas hemos trabajado con memoria dinámica. Mi pregunta es la siguiente... En el tipo Lista de datos creado, tengo una clase Nodo que contiene un numero(int), normal y corriente, y un puntero a otro nodo llamado siguiente. Código
Y una lista que contiene un puntero a Nodo que apunta a la cabeza. Código
Mi pregunta se genera al tratar de insertar en dicha lista ya que en el método insertar, lo que hago es crear un nodo mediante new, tal que... Código
Pero gracias a Valgrind, me he dado cuenta que todo esa memoria dinamica que estoy creando no la puedo borrar, ya que si hago el delete nodoaux; nodoaux=NULL; antes de el return, me aparece basura al salir del metodo y regresar al programa principal. Entiendo que es porque estoy borrando un puntero que he creado con los datos. ¿Habría alguna forma de salir del método, aun creando dentro de el un puntero a Nodo, igualando el principio de mi lista a ese puntero y gestionar bien la memoria? (Solo pongo el código para insertar al principio de la lista, los demás casos los he contemplado en mi práctica también pero con una gestión de memoria malisima :xD ) Espero respuesta! Muchas gracias :rolleyes: :rolleyes: Título: Re: Duda con punteros Publicado por: ThunderCls en 5 Junio 2018, 22:52 pm Si haces lo siguiente:
Código
Es lo mismo que si hicieras algo como esto: Código
No hay diferencias. Primero tienes que entender bien el concepto de punteros. En esta linea: Código
Solo estas copiando una direccion de memoria donde esta alojado un objeto "Nodo" y NO el objeto "Nodo" en si. Lo que seria lo mismo: Código
Por lo que si destruyes el objeto Nodo, dicha direccion de memoria (puntero) estara apuntando a basura en ambas variables, ya que ambas contenian la misma direccion de memoria (apuntaban al mismo objeto). En este caso debes implemetar la liberacion de memoria directamente en tu Lista ya sea en el destructor y/o en algun otro metodo destinado a ello (Clear, Free, etc). Código
Título: Re: Duda con punteros Publicado por: SrMcLister en 7 Junio 2018, 13:58 pm Buenas ThunderCls.
Si, entiendo que el Nodo que creo que es el que le meto el numero y apunta a primero es la misma dirección de memoria. Y si, en el tema de punteros he incidido bastante. El tema del destructor también lo controlo y está bien hecho. Sigo investigando, cuando tenga la solución la pongo por aquí. Un Saludo y gracias por tu respuesta! Título: Re: Duda con punteros Publicado por: MAFUS en 7 Junio 2018, 14:06 pm Entiendo que más que una lista es una pila, cada vez que insertas algo lo haces en la cabeza y lo que era la lista original pasa a la cola.
Título: Re: Duda con punteros Publicado por: SrMcLister en 7 Junio 2018, 14:17 pm Entiendo que más que una lista es una pila, cada vez que insertas algo lo haces en la cabeza y lo que era la lista original pasa a la cola. Es una lista, lo que pasa es que para resumir mi caso he puesto el insertar en cabeza de la lista, tengo el caso de insertar al final de la lista e insertar en medio, pero si es una lista, la pila no la he implementado... Lo único es que en vez de estar implementada secuencialmente, está enlazada mediante punteros. Un Saludo. Título: Re: Duda con punteros Publicado por: ThunderCls en 7 Junio 2018, 15:50 pm Buenas ThunderCls. Si, entiendo que el Nodo que creo que es el que le meto el numero y apunta a primero es la misma dirección de memoria. Y si, en el tema de punteros he incidido bastante. El tema del destructor también lo controlo y está bien hecho. Sigo investigando, cuando tenga la solución la pongo por aquí. Un Saludo y gracias por tu respuesta! Hola Pues si dominas todos estos aspectos que te comento entonces no entiendo donde tienes el problema. Tu pregunta inicial era "como gestionar bien la memoria en una lista simplemente enlazada"...bueno, pues creo que ya tienes la respuesta. Es sencillo, resumiendo, no puedes usar codigo de liberacion de memoria en el mismo metodo "Insertar", a no ser que uses copia de objecto en vez de copia de puntero. Necesitas crearte una funcion en la clase Lista que se encargue de liberar la memoria dinamica una vez hayas terminado de usarla. Al final de mi post anterior te puse un pseudocodigo como ejemplo. Saludos Título: Re: Duda con punteros Publicado por: MAFUS en 7 Junio 2018, 16:44 pm No domino C++ así que no puedo mostrarte cómo se hace con su sintaxis, pero si con C, por si te sirve de ayuda.
Título: Re: Duda con punteros Publicado por: SrMcLister en 7 Junio 2018, 18:28 pm No domino C++ así que no puedo mostrarte cómo se hace con su sintaxis, pero si con C, por si te sirve de ayuda. Te entiendo, muchas gracias pero la práctica es en C++.Estoy buscando la solución. La pondré cuando la tenga. Un Saludo. Título: Re: Duda con punteros Publicado por: SrMcLister en 7 Junio 2018, 18:29 pm Hola Pues si dominas todos estos aspectos que te comento entonces no entiendo donde tienes el problema. Tu pregunta inicial era "como gestionar bien la memoria en una lista simplemente enlazada"...bueno, pues creo que ya tienes la respuesta. Es sencillo, resumiendo, no puedes usar codigo de liberacion de memoria en el mismo metodo "Insertar", a no ser que uses copia de objecto en vez de copia de puntero. Necesitas crearte una funcion en la clase Lista que se encargue de liberar la memoria dinamica una vez hayas terminado de usarla. Al final de mi post anterior te puse un pseudocodigo como ejemplo. Saludos Buenas, gracias por responder, estoy intentando guardar el contenido de ese nodo en algún puntero no dinamico, para igualarlo a primero, si lo consigo lo comento. Un Saludo. |