2009-08-22 18 views
12

que tienen una clase de una base y una clase derivada B:¿Por qué mi destructor nunca se llama?

class A 
{ 
public: 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    ~B() 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 

Por alguna razón, el destructor nunca es llamado - ¿por qué? No entiendo esto.

+1

Aunque todo el mundo ya descubrió cuál es el problema (como es una pregunta frecuente en C++), sigo sugiriendo que muestre el código de cómo utiliza la clase B. (Si lo usa de esta manera: B * p = new B(); eliminar p; y el destructor nunca ha llamado, entonces debería ser un problema totalmente diferente.) –

Respuesta

35

Su clase base necesita un destructor virtual. De lo contrario, no se invocará el destructor de la clase derivada, si solo se utiliza un puntero de tipo A *.

Añadir

virtual ~A() {}; 

a la clase A.

+0

¿hay alguna razón para no usar este destructor virtual? en la clase principal? – sluki

7

La clase A debe tener un destructor virtual. Sin eso, los destructores de clase derivada no serán llamados.

+2

No se llamará si se llama al destructor mediante un puntero a A. –

3

intente esto:

class A 
{ 
public: 
    virtual ~A() {} 
    virtual f(); 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
     p = new char [100]; 
    } 
    virtual ~B() // virtual keywork optional but occasionally helpful for self documentation. 
    { 
     delete [] p; 
    } 
    f(); 
private: 
    char *p; 
}; 
3

Si la variable es de tipo A que no tiene un destructor virtual y por lo que ganó' Mire el tipo de tiempo de ejecución real del objeto para determinar que necesita llamar al destructor

A dd un destructor vacío a A

virtuales ~ A() {}

y que debe solucionarlo.

En general, necesita hacer esto en cualquier clase que pueda usarse como una clase base.

Cuestiones relacionadas