虚拟析构函数和 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?
拥有一个虚拟析构函数并不会负责删除 leftPtr
和 righPtr
。虚拟析构函数确保即使在基 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()
开始,您的代码将泄漏内存。
我已经阅读了一些关于该主题的其他类似问题,但我仍然对 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?
拥有一个虚拟析构函数并不会负责删除 leftPtr
和 righPtr
。虚拟析构函数确保即使在基 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()
开始,您的代码将泄漏内存。