Foros del Web » Programación para mayores de 30 ;) » C/C++ »

problema gordo con herencia del destructor

Estas en el tema de problema gordo con herencia del destructor en el foro de C/C++ en Foros del Web. bueno, compilen este código y la cuestión estará sobre la mesa: Código: 1 #include <iostream> 2 3 class padre{ 4 public: 5 padre(){ 6 std::cout ...
  #1 (permalink)  
Antiguo 20/10/2009, 16:33
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años
Puntos: 6
Información problema gordo con herencia del destructor

bueno, compilen este código y la cuestión estará sobre la mesa:

Código:
  1 #include <iostream>
  2 
  3 class padre{
  4     public:
  5     padre(){
  6         std::cout << "Padre creado" << std::endl;
  7     }
  8     ~padre(){
  9         std::cout << "Padre destruido" << std::endl;
 10     }
 11 };
 12 
 13 class hijo : padre{
 14     public:
 15     hijo(){
 16         std::cout << "Hijo creado" << std::endl;
 17     }
 18     ~hijo(){
 19         std::cout << "Hijo destruido" << std::endl;
 20     }
 21 };
 22 
 23 int main(int argc, char** argv)
 24 {
 25     hijo *p = new hijo();
 26     delete []p;
 27     return 0;
 28 }

POR QUE *#%@¬ SE ME DESBORDA LA MEMORIA?

no entiendo, tal vez tenga mal los conceptos básicos sobre herencia de clases.

datos:

Uso linux, concretamente ubuntu
y compilo con g++:
g++ herencia.cpp
no creo que haga falta más...
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter
  #2 (permalink)  
Antiguo 21/10/2009, 08:48
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años
Puntos: 6
Respuesta: problema gordo con herencia del destructor

Bueno, al parecer nadie me ha respondido por ignorancia o porque simplemente no les interesa, pero ya no importa, he solucionado el problema y para los que no sepan, o sean curiosos he de destacar una obviedad para resolver mi problema:

la función delete funciona con punteros, es decir, el argumento requerido es un puntero, en el momento mismo en que declaro <code>delete []p</code> estoy diciendo que borre el elemento correspondiente al puntero p "[]p", pero p es de por sí un puntero, con lo cual lo que en realidad envío es hipotéticamente un puntero a una tabla de punteros "**p" lo cual es una mentira, porque p no apunta a una tabla de objetos "hijo", es aquí, no sé exactamente en que forma, cuando delete desborda la memoria intentando borrar una tabla de punteros a objetos que no existe, y que por tanto no tiene límite.

Declaro que lo dicho anteriormente es una deducción propia, que por falta de fuentes, no he podido confirmar, así que si alguien sabe si esto es falso, que por favor indique el porqué.

gracias a todos y espero que esto les sirva.
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter
  #3 (permalink)  
Antiguo 21/10/2009, 12:00
Avatar de r0d
r0d
 
Fecha de Ingreso: noviembre-2007
Mensajes: 86
Antigüedad: 16 años, 5 meses
Puntos: 3
Respuesta: problema gordo con herencia del destructor

Hola,

no entiendo lo que dices, pero tienes que saber algo importantisimo: cuando creas una clase destinada a ser heredida, el destructor de esta clase tiene que ser virtual.

En tu caso:
Código cpp:
Ver original
  1. class padre{
  2. public:
  3.    padre(){
  4.    std::cout << "Padre creado" << std::endl;
  5.    }
  6.    
  7.    virtual ~padre(){
  8.    std::cout << "Padre destruido" << std::endl;
  9.    }
__________________
Alicia: Sólo quiero saber que camino debo tomar.
Gato risón: Pues... depende mucho de donde quieras ir.

Mi página web
  #4 (permalink)  
Antiguo 23/10/2009, 10:40
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años
Puntos: 6
Respuesta: problema gordo con herencia del destructor

No se si sepas exactamente qué son las funciones virtuales, no voy a entrar en el tema, porque según lo visto no me hago entender mucho, la cosa es que para esta herencia en particular lo que menos querría sería que el destructor de la clase base sea virtual.

http://www.zator.com/Cpp/E4_11_2d2.htm <-- para quien quiera saber más acerca de los destructores
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter

Última edición por jaao_death; 23/10/2009 a las 10:45 Razón: ortografía
  #5 (permalink)  
Antiguo 23/10/2009, 10:42
Avatar de jaao_death  
Fecha de Ingreso: abril-2009
Ubicación: Murcia/españa
Mensajes: 229
Antigüedad: 15 años
Puntos: 6
Respuesta: problema gordo con herencia del destructor

código último: este ya no presenta problemas

Código:
  1 #include <iostream>
  2 
  3 class padre{
  4     public:
  5     padre(){
  6         std::cout << "Padre creado" << std::endl;
  7     }
  8     ~padre(){
  9         std::cout << "Padre destruido" << std::endl;
 10     }
 11 };
 12 
 13 class hijo : padre{
 14     public:
 15     hijo(){
 16         std::cout << "Hijo creado" << std::endl;
 17     }
 18     ~hijo(){
 19         std::cout << "Hijo destruido" << std::endl;
 20     }
 21 };
 22 
 23 int main(int argc, char** argv)
 24 {
 25     hijo *p = new hijo();
 26     delete p; // antes: delete []p  <-- para borrar punteros a tablas.
 27     return 0;
 28 }
__________________
Mucha seguridad nunca es suficiente.... Por una red segura
El señor ilustre obscurece nuestras mentes
Usas Linux? http://www.dudalibre.com/gnulinuxcounter
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:49.