【发布时间】:2019-06-16 00:45:45
【问题描述】:
我有以下代码:
class Node {
public:
int data;
Node* parent;
std::unique_ptr<Node> left;
std::unique_ptr<Node> right;
public:
explicit Node(int d) : data(d),
parent(nullptr),
left(nullptr),
right(nullptr) { }
/*
Some functions
*/
};
class dt {
private:
Node* root;
private:
void add_helper(Node* parent, Node* node);
/*
Some helper functions
*/
public:
dt() : root(nullptr) {}
~dt() {
delete root;
}
/*
Some functions
*/
void add(int data);
};
void dt::add(int data) {
if(!root) {
root = new Node(data); // 1: memory leak
return;
}
Node* node = new Node(data); // 2: memory leak
add_helper(root, node);
}
当我扫描此代码以查找内存泄漏时 Dr.内存 在上面的 cmets 中提到的行上显示错误。但它们真的是内存泄漏吗? dt 具有析构函数,其中 root 指针正在删除。当析构函数开始删除 root 节点时,它将递归地删除所有子节点。还是发生了其他事情?
【问题讨论】:
-
看不到内存泄漏,但我肯定会看到大量内存损坏,并且几乎肯定会崩溃,如果您尝试实际删除具有至少几个的树的根节点层次结构的层次。我强烈怀疑其余未显示的代码实际上从未尝试删除整个树。
-
...@SamVarshavchik 所说的内容,请将其设为minimal reproducible example,以便我们进行相同的分析。
-
为什么Node析构函数会删除它的父级?通常模式是让每个节点删除其子节点(在您的情况下,这是通过 std::unique_ptr 的 dtor 发生的,这很好)
-
Ted Lyngmo - 同意将发布最小的工作示例。
-
@ՎարդանԳրիգորյան 没关系,慢慢来。将来,请准备好获得相同的要求,因此首先将您的问题压缩为可以复制、编译和分析的代码,而无需填写任何空白。
标签: c++ pointers memory-leaks destructor dr-memory