Почему мой деструктор никогда не вызывается? - PullRequest
12 голосов
/ 22 августа 2009

У меня есть базовый класс A и производный класс B:

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

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

По какой-то причине деструктор никогда не называется - почему? Я не понимаю этого.

Ответы [ 4 ]

36 голосов
/ 22 августа 2009

Вашему базовому классу нужен виртуальный деструктор. В противном случае деструктор производного класса не будет вызван, если используется только указатель типа A *.

Добавить

virtual ~A() {};

в класс А.

7 голосов
/ 22 августа 2009

Класс А должен иметь виртуальный деструктор. Без этого деструкторы производных классов не будут вызываться.

3 голосов
/ 22 августа 2009

Если ваша переменная имеет тип A, у нее нет виртуального деструктора, и поэтому она не будет смотреть на фактический тип времени выполнения объекта, чтобы определить, что ему нужно вызвать деструктор

Добавить пустой деструктор в A

виртуальный ~ A () {}

и это должно исправить.

Как правило, это нужно делать для любого класса, который может использоваться в качестве базового класса.

3 голосов
/ 22 августа 2009

попробуйте это:

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