为什么我的析构函数永远不会被调用?(Why is my destructor never calle

2019-08-02 04:07发布

我有一个基类A和派生类B:

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

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

对于任何原因析构函数没有被调用 - 为什么? 我不明白这一点。

Answer 1:

你的基类需要一个虚析构函数。 否则派生类的析构函数将不会被调用,如果仅使用类型A *的一个指针。

virtual ~A() {};

为A级。



Answer 2:

A类应该有一个虚析构函数。 不这样做,派生类的析构函数不会被调用。



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


Answer 4:

如果变量是A型的它没有虚析构函数,所以它不会看实际的运行时类型的对象,以确定它需要调用desstructor

添加一个空的析构函数至A

虚拟〜A(){}

这应该修复它。

一般来说,你需要这样做上可能被用作基类中的任何类。



文章来源: Why is my destructor never called?