虚拟析构函数和删除关键字

时间:2016-04-01 19:57:28

标签: c++ pointers virtual-destructor

我已经阅读了一些关于这个主题的其他类似问题,但我仍然对使用delete动态分配内存和虚拟析构函数感到困惑。如果我在链接结构中有一个类Base或类Derived的对象,那么如果我删除一个节点,我也想删除所有可以将该节点称为祖先的节点。我是否需要在析构函数中指定它,如下所示?或者使用没有两个delete的虚拟析构函数来处理这个问题?

class Base{ /*...*/ };

class Derived: public Base
{
    public:
       //various virtual functions//
       virtual ~Derived()
       {
           delete leftPtr;
           delete rightPtr;
       }
    private:
       Base* leftPtr = new Derived();
       Base* rightPtr = new Derived();
};

1 个答案:

答案 0 :(得分:2)

  

或者使用没有两次删除的虚拟析构函数会不会解决这个问题?

拥有虚拟析构函数不会删除leftPtrrighPtr。虚拟析构函数确保即使在基类指针上使用delete,也会调用与大多数派生对象相对应的析构函数。

您尚未证明Base具有虚拟析构函数。假设确实如此,

Derived* ptr1 = new Derived;
delete ptr1; // Calls ~Derived()

Base* ptr2 = new Derived;
delete ptr2; // Also calls ~Derived()

但是,如果你遗漏了

delete leftPtr;
delete rightPtr;

来自Derived::~Derived(),您的代码会泄漏内存。