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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


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

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Duda con punteros
« 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
  1.  
  2. class Nodo{
  3.   friend class Lista;
  4. private:
  5.   int n;
  6.   Nodo* siguiente;
  7. ...
  8. }
  9.  
  10.  

Y una lista que contiene un puntero a Nodo que apunta a la cabeza.

Código
  1.  
  2. class Lista{
  3.   friend class Nodo;
  4. private:
  5.   Nodo *primero;
  6. ...
  7. }
  8.  
  9.  

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
  1.  
  2. bool Lista::Insertar(const int &n){
  3.   Nodo *nodoaux = new Nodo;
  4.   nodoaux->n = n;
  5.   this->primero=nodoaux;
  6.   return true;
  7. }
  8.  
  9.  

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:


« Última modificación: 7 Junio 2018, 14:32 pm por SrMcLister » En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Duda con punteros
« Respuesta #1 en: 5 Junio 2018, 22:52 pm »

Si haces lo siguiente:

Código
  1. Nodo *nodoaux = new Nodo;
  2. nodoaux->n = n;
  3. this->primero=nodoaux;
  4. delete nodoaux;
  5.  

Es lo mismo que si hicieras algo como esto:
Código
  1. Nodo *nodoaux = new Nodo;
  2. nodoaux->n = n;
  3. this->primero=nodoaux;
  4. delete this->primero;
  5.  

No hay diferencias. Primero tienes que entender bien el concepto de punteros. En esta linea:
Código
  1. this->primero=nodoaux;

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
  1. nodoaux=0x00001->Nodo
  2. this->primero=0x00001->Nodo

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
  1. while ((actual = primero) != NULL) {
  2.    primero = primero->siguiente;          
  3.    delete actual;
  4.    actual = null;
  5. }


« Última modificación: 5 Junio 2018, 22:56 pm por ThunderCls » En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
SrMcLister

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: Duda con punteros
« Respuesta #2 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!
En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
MAFUS


Desconectado Desconectado

Mensajes: 1.603



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

SrMcLister

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: Duda con punteros
« Respuesta #4 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.
En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
ThunderCls


Desconectado Desconectado

Mensajes: 455


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Duda con punteros
« Respuesta #5 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
En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Duda con punteros
« Respuesta #6 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.
En línea

SrMcLister

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: Duda con punteros
« Respuesta #7 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.
En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
SrMcLister

Desconectado Desconectado

Mensajes: 35



Ver Perfil
Re: Duda con punteros
« Respuesta #8 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.
En línea

Código
  1. return((u.areHappy() && u.knowIt()) ? u.clapYourHands() : u.goFuckYourself());
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[C] - Duda punteros
Programación C/C++
h0oke 2 2,365 Último mensaje 23 Mayo 2010, 02:19 am
por h0oke
Duda con punteros
Programación C/C++
cazagavilan 5 2,887 Último mensaje 14 Abril 2012, 05:47 am
por cazagavilan
Duda Punteros Dobles/Array de punteros
Programación C/C++
MisterJava 2 4,922 Último mensaje 30 Diciembre 2012, 20:19 pm
por MisterJava
Duda con Punteros en C
Programación C/C++
LeoJ24 2 1,722 Último mensaje 13 Enero 2013, 20:49 pm
por ameise_1987
Duda con Punteros - C
Programación C/C++
LeoJ24 6 2,969 Último mensaje 21 Enero 2013, 01:34 am
por dato000
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines