Ответ 1
Вашему базовому классу нужен виртуальный деструктор. В противном случае деструктор производного класса не будет вызываться, если используется только указатель типа A *.
Добавить
virtual ~A() {};
в класс A.
У меня есть базовый класс A и производный класс B:
class A
{
public:
virtual f();
};
class B : public A
{
public:
B()
{
p = new char [100];
}
~B()
{
delete [] p;
}
f();
private:
char *p;
};
По какой-то причине деструктор никогда не называется - почему? Я не понимаю этого.
Вашему базовому классу нужен виртуальный деструктор. В противном случае деструктор производного класса не будет вызываться, если используется только указатель типа A *.
Добавить
virtual ~A() {};
в класс A.
Класс A должен иметь виртуальный деструктор. Без этого вывод деструкторов класса не будет вызываться.
попробуйте следующее:
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;
};
Если ваша переменная имеет тип A, она не имеет виртуального деструктора и поэтому не будет смотреть на фактический тип времени выполнения объекта, чтобы определить, что ему нужно вызвать десстректор
Добавьте пустой деструктор в A
virtual ~ A() {}
и это должно исправить его.
В общем, вам нужно сделать это на любом классе, который можно использовать в качестве базового класса.