c++ - 如何销毁包含自引用指针的对象?

标签 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 语句会调用同一结构的析构函数。


问题:

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

最佳答案

正确的方法是不使用拥有原始指针,而是为 child 使用 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/

相关文章:

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c - 理解 C 中的简单指针

c - 以整数形式返回指针的地址位置

c++ - std::vector<T>::使用子范围赋值有效吗?

c++ - 使用局部变量调用函数或填充控制 if 语句比直接嵌套函数调用更有效吗?

c++ - 在 C++11 中,如何调用 new 并为对象预留足够的内存?

c# - 在 Dispose() 中设置 obj = null(Nothing) 有什么意义吗?

您能否举例说明我列出的有关 c11 标准的 calloc 的提示,以帮助我理解它们?

c++ - VS2012 中的 is_directory() 对于偶数目录返回 false

c++ - 将 head 设置为 NULL ('NULL' : undeclared identifier)