虚拟析构函数和 delete 关键字

Virtual Destructors and delete keyword

我已经阅读了一些关于该主题的其他类似问题,但我仍然对 delete 用于动态分配的内存和虚拟析构函数感到困惑。如果我在链接结构中有一个 class Base 或 class 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();
};

Or will the use of a virtual destructor without the two deletes take care of this already?

拥有一个虚拟析构函数并不会负责删除 leftPtrrighPtr。虚拟析构函数确保即使在基 class 指针上使用 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() 开始,您的代码将泄漏内存。