我有一个树节点结构,简单定义为:
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
语句会调用相同结构的析构函数。
问题:
答案 0 :(得分:2)
正确的方法是不使用拥有原始指针,而是为孩子使用std::unique_ptr
。
如果你也摆脱了多余的typedef
,结构看起来像这样:
struct TreeNode {
int data;
std::unique_ptr<TreeNode> left;
std::unique_ptr<TreeNode> right;
TreeNode *parent{nullptr};
TreeNode() = default;
};
现在你不需要做任何事情,编译器会为你生成正确的解构函数。
答案 1 :(得分:1)
如果不调用父析构函数,它应该可以工作。但是,如上所述,该节点下的整个树将被删除。