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

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

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


为了释放销毁后leftrightparent对象所指向的内存(假定不为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/

10-11 18:35