我有一个树节点结构,它被简单地定义为:
typedef struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
TreeNode(int);
~TreeNode();
} TreeNode;
为了在销毁时释放由 left
、right
和 parent
对象指向的内存(假设不为空),我创建了一个析构函数如下:
TreeNode::~TreeNode() {
delete left;
delete right;
delete parent;
}
但是,这样做会导致控件无限递归地删除 TreeNode
对象,因为析构函数中的那些 delete
语句会调用同一结构的析构函数。
问题:
- 释放自引用指针的正确方法是什么,特别是在析构函数中?
最佳答案
正确的方法是不使用拥有原始指针,而是为 child 使用 std::unique_ptr
。
如果您还去掉了多余的 typedef
,则该结构如下所示:
struct TreeNode {
int data;
std::unique_ptr<TreeNode> left;
std::unique_ptr<TreeNode> right;
TreeNode *parent{nullptr};
TreeNode() = default;
};
现在您不需要做任何事情,编译器将为您生成正确的解构函数。
关于c++ - 如何销毁包含自引用指针的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43663044/