如何破坏包含自引用指针的对象?

时间:2017-04-27 16:17:34

标签: c++ pointers memory-management destructor delete-operator

我有一个树节点结构,简单定义为:

typedef struct TreeNode {
    int data;
    TreeNode *left;
    TreeNode *right;
    TreeNode *parent;

    TreeNode(int);
    ~TreeNode();
} TreeNode;

为了释放leftrightparent对象在销毁时指向的内存(假设不为空),我按如下方式创建了一个析构函数:

TreeNode::~TreeNode() {
    delete left;
    delete right;
    delete parent;
}

但是,这样做会导致控件无限递归地删除TreeNode个对象,因为析构函数中的那些delete语句会调用相同结构的析构函数。

问题:

  • 释放自引用指针的正确方法是什么,特别是在析构函数内部?

2 个答案:

答案 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)

如果不调用父析构函数,它应该可以工作。但是,如上所述,该节点下的整个树将被删除。