我有一个树节点结构,该结构简单地定义为:
typedef struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
TreeNode(int);
~TreeNode();
} TreeNode;
为left
,right
和parent
对象指向的自由记忆(假设不是null(,我对destructor进行了如下:
TreeNode::~TreeNode() {
delete left;
delete right;
delete parent;
}
但是,这样做会导致控件无限递归地删除TreeNode
对象,因为destructor中的那些delete
语句称为相同结构的破坏者。
问题:
- 什么是释放自我参照指针的正确方法,特别是在灾难中?
正确的方法是不使用原始指针,而是将std::unique_ptr
用于孩子。
如果您还摆脱了多余的typedef
,则结构看起来像这样:
struct TreeNode {
int data;
std::unique_ptr<TreeNode> left;
std::unique_ptr<TreeNode> right;
TreeNode *parent{nullptr};
TreeNode() = default;
};
现在您无需做任何事情,编译器将为您生成正确的解构器。
,如果您不调用父驱动器,则应工作。但是,如上所述,该节点下面的整个树将被删除。