2009-08-22 5 views
12

J'ai une classe de base A et une classe dérivée B:Pourquoi mon destructeur n'est jamais appelé?

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

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

Pour une raison quelconque, le destructor est jamais appelé - pourquoi? Je ne comprends pas ça.

+1

Bien que tout le monde ait déjà compris quel est le problème (Comme c'est une FAQ en C++), je suggère toujours de montrer au code comment vous utilisez la classe B. (Si vous l'utilisez comme ça: B * p = new B(); delete p; et le destructeur n'a jamais été appelé, alors cela devrait être un problème totalement différent.) –

Répondre

35

Votre classe de base a besoin d'un destructeur virtuel. Sinon, le destructeur de la classe dérivée ne sera pas appelé, si seulement un pointeur de type A * est utilisé.

Ajouter

virtual ~A() {}; 

à la classe A.

+0

Y at-il une raison pour ne pas utiliser ce destructeur virtuel? dans la classe principale? – sluki

7

La classe A doit avoir un destructeur virtuel. Sans cela, les destructeurs de classes dérivés ne seront pas appelés.

+2

Ne sera pas appelé si le destructeur est appelé via un pointeur vers A. –

3

essayez ceci:

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 votre variable est de type A, il ne dispose pas d'un destructeur virtuel et il a gagné » t regarder le type d'exécution réel de l'objet pour déterminer qu'il doit appeler le dessiccateur

A dd un destructor vide à A

virtuel ~ A() {}

et qui devrait le fixer.

En général, vous devez le faire sur n'importe quelle classe pouvant être utilisée comme classe de base.

Questions connexes