12
votes

Pourquoi mon destructeur est-il jamais appelé?

J'ai une classe de base A et une classe B dérivée B: xxx

Pour une raison quelconque, le destructeur n'est jamais appelé - pourquoi? Pourquoi? Je ne comprends pas cela.


1 commentaires

Bien que tout le monde ait déjà compris ce que le problème est (tel qu'il s'agit d'une FAQ en C ++), je vous suggère toujours que vous devriez montrer le code comment vous utilisez la classe B. (Si vous l'utilisez de cette façon: B * p = nouveau B () ; supprimer p; et le destructeur n'a jamais appelé, alors il devrait être un problème totalement différent.)


4 Réponses :


7
votes

La classe A devrait avoir un destructeur virtuel. Sans cela, destructeurs de classe de classe ne seront pas appelés.


1 commentaires

Ne sera pas appelé le destructeur est appelé via un pointeur à A.



36
votes

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 P>

virtual ~A() {};


1 commentaires

Y a-t-il une raison de ne pas utiliser ce destructeur virtuel dans la classe principale?



3
votes

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;
};


0 commentaires

3
votes

Si votre variable est de type A, il n'a pas de destructeur virtuel et il ne regardera donc pas le type d'exécution réel de l'objet pour déterminer qu'il doit appeler le DessRuctor

Ajouter un destructeur vide à un

virtuel ~ a () {}

et cela devrait le réparer.

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


0 commentaires