• Viernes 8 de Noviembre de 2024, 21:50

Autor Tema:  Destrucción objeto  (Leído 835 veces)

macalo

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Destrucción objeto
« en: Sábado 22 de Enero de 2011, 18:44 »
0
Hola,

Tengo una aplicación en la que todo parece que va bien hasta que pasado un tiempo,que nunca es el mismo, se cae.Parec que es un pisotön de memoria.
He estado mirando y no se si puede ser por esto:
class C;
class D;
class A{
 
  A();
  Ã();
};
A::A()
{
   p = new C;
   q =  new D;
A::Ã()
{

  delete p;
  delete q;
}
}
class B{

 A* a;
  void init(A* _a);
};
 void B::init(A* _a )
{
    a = _a;
 }
main()
{
   A* a = new A();
   B b;
  b.init(a);
}
En la llamada b.init(a) ¿se llama al destructor de la clase A cuando _a sale de su ambito y por consiguiente los punteros c y d están apuntando a basura?.O como
es un puntero lo que se le pasa al método lo que se destruye es el puntero y no a lo que apunta.
Si este es el caso se solucionaría con un operador de asignación donde se asigne memoria a dichos punteros.¿no?
Saludos

 :D

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Destrucción objeto
« Respuesta #1 en: Sábado 22 de Enero de 2011, 20:29 »
0
Cita de: "macalo"
1.En la llamada b.init(a) ¿se llama al destructor de la clase A cuando _a sale de su ambito y por consiguiente los punteros c y d están apuntando a basura?.
R. El destructor es llamado solo cuando se destruye el objeto mediante delete, por lo tanto aunque salgas del ambito de la variable, el objeto no es destruido. Para que destruyeras "a" dentro del ambito de la clase B, tendrias que hacer un "delete a" dentro de "b".

Citar
2. O como es un puntero lo que se le pasa al método lo que se destruye es el puntero y no a lo que apunta.

R. No estoy muy seguro de haberte entendido bien aca, pero me parece que preguntas casi lo mismo que antes, y no, de nuevo, el puntero no es destruido, lo unico que sucede es que fuera de la clase B, la variable "_a"  y "a" que defines dentro de la clase no existen, se consideran como si fueran variables locales a la clase solamente, aunque afuera de b tengas una variable llamada "a" y adentro tambien, al entrar a "b" toma preferencia tu variable local "a", y la variable externa "a" es como si no existiera, ya que queda oculta por la variable "a" que defines dentro de la clase "B". La forma de destruir los punteros es que hicieras delete en alguna parte, de esa forma si tendrias punteros no validos, y al menos en el ejemplo que pones no veo ningun delete en la clase B.

Desconozco que compilador utilizas, pero recomiendo que utilices el depurador (debugger) que venga con tu compilador (casi todos los compiladores modernos cuentan con debugger), ejecuta paso por paso cada linea, metodo por metodo, utiliza puntos de interrupcion, revisa contenido de variables mientras vas depurando, revisa bien tu inicializacion de variables y tambien las sentencias donde haces new and delete, de esa forma es mas probable que encuentres en donde esta el fallo.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================