我有一个树节点结构,其简单定义为:
typedef struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
TreeNode *parent;
TreeNode(int);
~TreeNode();
} TreeNode;
为了释放销毁后
left
,right
和parent
对象所指向的内存(假定不为null),我按如下方式构造了一个析构函数:TreeNode::~TreeNode() {
delete left;
delete right;
delete parent;
}
但是,这样做会导致控件无限递归地删除
TreeNode
对象,因为析构函数中的那些delete
语句调用相同结构的析构函数。题:
释放自引用指针的正确方法是什么,尤其是在析构函数内部?
最佳答案
正确的方法是不使用拥有的原始指针,对子代使用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/