为什么我的析构函数从未被调用过?

时间:2009-08-22 08:52:58

标签: c++ memory-leaks

我有一个基类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 个答案:

答案 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(){}

那应该解决它。

通常,您需要在任何可能用作基类的类上执行此操作。