我已经阅读了一些关于这个主题的其他类似问题,但我仍然对使用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();
};
答案 0 :(得分:2)
或者使用没有两次删除的虚拟析构函数会不会解决这个问题?
拥有虚拟析构函数不会删除leftPtr
和righPtr
。虚拟析构函数确保即使在基类指针上使用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()
,您的代码会泄漏内存。