我有一个基类A和一个派生类B:
class A
{
public:
virtual f();
};
class B : public A
{
public:
B()
{
p = new char [100];
}
~B()
{
delete [] p;
}
f();
private:
char *p;
};
出于任何原因,析构函数从未被调用 - 为什么?我不明白这一点。
答案 0 :(得分:36)
您的基类需要一个虚拟析构函数。否则,如果仅使用类型为A *的指针,则不会调用派生类的析构函数。
添加
virtual ~A() {};
到A级。
答案 1 :(得分:7)
A类应该有一个虚拟析构函数。没有它,就不会调用派生类析构函数。
答案 2 :(得分: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;
};
答案 3 :(得分:3)
如果您的变量是A类型,则它没有虚拟析构函数,因此它不会查看对象的实际运行时类型以确定它需要调用desstructor
将空的析构函数添加到A
虚拟~A(){}
那应该解决它。
通常,您需要在任何可能用作基类的类上执行此操作。