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



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

typedef struct TreeNode {
    int data;
    TreeNode *left;
    TreeNode *right;
    TreeNode *parent;
    TreeNode(int);
    ~TreeNode();
} TreeNode;

leftrightparent对象指向的自由记忆(假设不是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;
};

现在您无需做任何事情,编译器将为您生成正确的解构器。

,如果您不调用父驱动器,则应工作。但是,如上所述,该节点下面的整个树将被删除。

最新更新