记忆博士:这些台词真的是导致内存泄漏的原因吗?
Dr. Memory: are these lines really causing of memory leaks?
我有以下代码:
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);
}
当我扫描此代码以查找内存泄漏时,内存博士在上面评论中提到的行上显示错误。但它们真的是内存泄漏吗?dt具有析构函数,其中根指针正在删除。当析构函数开始删除根节点时,它将递归并删除他的所有子节点。还是发生了其他事情?
这些行真的是内存泄漏的原因吗?
在联机Node* node = new Node(data)
上分配的内存可能已泄漏。至少该示例没有显示指针将被删除的位置。所有权可能会在add_helper
内转移,但这已被排除在示例中。
我不熟悉Dr. Memory,但我假设它报告了泄漏的内存被分配的位置;而不是它被泄露的位置。
此外,如果您创建dt
实例的副本,则程序的行为将未定义,因为原始和副本都将尝试删除复制的指针。
若要修复潜在的内存泄漏和潜在的 UB,请使用唯一指针。就像你用Node
一样.
我不能将unqiue_ptr用于根,因为有多个指向同一节点的指针。
通过在析构函数中执行delete root;
,您的类将获得指针的唯一所有权。如果该假设是正确的,那么使用唯一指针就没有问题。如果假设不正确,则析构函数可能会导致未定义的行为。使用它而不是唯一指针不是解决方案。您可能需要改用共享指针。
最后,除非树是平衡的,否则隐式递归析构函数具有线性增加的最坏情况递归深度,这很容易导致堆栈溢出。您应该平衡树(例如使用红背或 AVL 增强)或使用迭代算法来销毁子级。
相关文章:
- C++功能泄漏内存,我是C++新手,不确定如何解决
- 我的堆栈弹出式磁带的实现是否泄漏内存?
- 将 c++ 向量转换为字符 ** 而不会泄漏内存
- 析构函数 C++ 使泄漏内存
- 构造函数对象赋值是否泄漏内存
- corba :: orb_init泄漏内存
- Gmock泄漏内存
- 如何在不泄漏内存的情况下删除链接列表
- Visual C ODBC关闭记录集泄漏内存
- 为什么泄漏内存比在动态数组上执行 delete[] 慢
- OpenGL正在泄漏内存.哪个对象未释放
- 可以std ::退出泄漏内存
- uiautomation findall泄漏内存
- 为什么在此OpenCL代码中泄漏内存,为什么要泄漏内存
- pthread在完成后会泄漏内存
- win32 标准::线程泄漏内存
- 返回指向同一变量的指针是否会泄漏内存
- 使用clectType(new any_type())可能会泄漏内存泄漏
- Windows开发:如何确定我的应用程序是否正在泄漏内存
- WinHttp打开泄漏内存