Hola, muy buenas. Estoy realizando un árbol binario en C++. Lo estoy encapsulando en una clase. Como cualquier árbol binario, este tiene un dato, un puntero a la izquierda y otro a la derecha. El problema es que al llamar al destructor (el cual lo elimina), el programa finaliza brúscamente. El constructor es el siguiente:
Este es la función main:
Cuando uso el depurador, pongo un punto de ruptura en el destructor, y obtengo lo siguiente:
Lo que no sé es: ¿por qué se llama 3 veces al constructor? En la última llamada, ¿por qué el puntero this vale 0 (supongo que por esto el programa crashea)?
Muchas gracias
Código (cpp) [Seleccionar]
template <typename T>
class ArbolBinario {
private:
T dato;
ArbolBinario *izda;
ArbolBinario *dcha;
void Eliminar(ArbolBinario *rama) {
if(NULL != rama->izda)
Eliminar(rama->izda);
if(NULL != rama->dcha)
Eliminar(rama->dcha);
delete rama;
}
public:
[...]
~ArbolBinario() {
EliminarRamaIzda();
EliminarRamaDcha();
}
[...]
void EliminarRamaIzda() {
if(NULL != izda) {
Eliminar(izda);
izda = NULL;
}
}
void EliminarRamaDcha() {
if(NULL != dcha) {
Eliminar(dcha);
dcha = NULL;
}
}
[...]
};
Este es la función main:
Código (cpp) [Seleccionar]
int main() {
ArbolBinario<int> arbol;
arbol.SetDato(7, "");
arbol.ReemplazarRamaIzda(20, "");
arbol.ReemplazarRamaIzda(5, "0");
arbol.ReemplazarRamaDcha(7, "00");
arbol.ReemplazarRamaDcha(4, "0");
arbol.ReemplazarRamaIzda(1, "01");
arbol.ReemplazarRamaDcha(2, "01");
arbol.ReemplazarRamaDcha(8, "");
arbol.ReemplazarRamaIzda(10, "1");
cout << arbol.ToString();
return 0;
}
Cuando uso el depurador, pongo un punto de ruptura en el destructor, y obtengo lo siguiente:
Código [Seleccionar]
Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x28fddc, __in_chrg=<optimized out>) at main.cpp:84
84 EliminarRamaIzda();
(gdb) continue
Continuing.
Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x720fb0, __in_chrg=<optimized out>) at main.cpp:84
84 EliminarRamaIzda();
(gdb) continue
Continuing.
Breakpoint 1, ArbolBinario<int>::~ArbolBinario (this=0x7212f0, __in_chrg=<optimized out>) at main.cpp:84
84 EliminarRamaIzda();
(gdb) continue
Continuing.
Program received signal SIGSEGV, Segmentation fault.
0x004099bb in ArbolBinario<int>::Eliminar (this=0x0, arbol=0x726f58)
at main.cpp:13
13 void Eliminar(ArbolBinario *arbol) {
Lo que no sé es: ¿por qué se llama 3 veces al constructor? En la última llamada, ¿por qué el puntero this vale 0 (supongo que por esto el programa crashea)?
Muchas gracias