【发布时间】:2017-09-25 13:25:32
【问题描述】:
我有一个树节点结构,简单定义为:
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 语句调用了相同结构的析构函数。
问题:
- 释放自引用指针的正确方法是什么,特别是在析构函数内部?
【问题讨论】:
-
您最好阅读
std::unique_ptr、std::shared_ptr和std::weak_ptr。 -
你不应该有一个包含
TreeNode的Tree类,并且Tree类在必要时创建和销毁节点吗?您当前的设计通过删除单个节点来解开整个树。如果只想删除一个节点怎么办? -
@Jesper 我真的只是从 C++ 开始,所以在我了解基础知识之前,我才会转向更高级的东西:D
-
@Christian 处理拥有原始指针并使用
new和delete手动管理内存是高级的东西。 -
@Christian 你误会了。我试图为您指明simple 解决方案的方向。您已经通过使用(老式)手动内存管理开始了hard路径。
标签: c++ pointers memory-management destructor delete-operator