Подтвердить что ты не робот

Почему мой деструктор никогда не звонил?

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

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

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

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

4b9b3361

Ответ 1

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

Добавить

virtual ~A() {};

в класс A.

Ответ 2

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

Ответ 3

попробуйте следующее:

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

Ответ 4

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

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

virtual ~ A() {}

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

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