c++ - 将节点设置为新节点()时的内存泄漏
问题描述
我创建了一个我认为工作正常的二叉搜索树,直到我开始尝试将它用于集合实现。我遇到了一些内存泄漏的问题,这些内存泄漏似乎是在向树中添加节点时发生的。我已经推断出我的addNode
函数以真正了解问题发生在哪里,这就是 Valgrind 所指向的线。
bool addNode(const T &data) override {
if (root == nullptr) {
root = new Node(); // <--- THIS LINE IS SHOWING UP
root->left = nullptr;
root->right = nullptr;
root->data = data;
return true;
}
return addNode(root, data);
}
当我使用 Valgrind 运行它时,这是我得到的输出。
我有 2 个问题。
问题1:这个错误实际上是指向内存泄漏开始的行吗?还是出现内存泄漏的地方?
问题 2:我怎样才能让这种情况不发生?我很高兴发布您认为需要回答此问题的任何代码,但我不确定从哪里开始。希望这可以让某人朝着正确的方向前进。
编辑:我应该提到这是一个学校项目,因此任何“奇怪”的东西,比如你不需要的布尔函数和其他东西。在假设我正在做一些不需要做的事情之前,请先询问。
编辑2:这是一些代码:
BST() {
root = nullptr;
size = 0;
}
还有更多:
class Set: SetInterface<T> {
private:
BST<T> tree;
public:
bool insert(const T &item) override {
return tree.addNode(item);
}
...
}
Set 是 HashMap 实现中的值,它以字符串为键。
这是我的析构函数:
~BST() override {
this->clearTree();
}
和clearTree()
:
private:
void clearTree(Node*& node) {
if (node == nullptr) return;
// Delete the children, then delete the given node
clearTree(node->left);
clearTree(node->right);
delete node;
node = nullptr;
}
public:
bool clearTree() override {
clearTree(root);
size = 0;
return true;
}
还有一点,虽然我不知道它有多容易理解,但当它出错时,这就是我使用它的方式。当我只做一组字符串时,我没有任何内存泄漏。当我在 HashMap 中执行字符串集时,它确实出现了。这是我使用它的代码。
HashMap<string, Set<string>> ineffectives;
while (getline(in, line)) {
stringstream ss(line);
// ... A bunch of if statements ...
string move, otherMove;
ss >> move;
ineffectives[move] = Set<string>();
while (ss >> otherMove) {
ineffectives[move].insert(otherMove);
}
}
解决方案
我确实发现了问题。以下行在我发布的最后一段代码中:
ineffectives[move] = Set<string>();
这是 uneccesary 并导致泄漏,因为当我声明
HashMap<string, Set<string>>
它已经创建了所有字符串集。当我删除那条线时,它可以正常工作而不会泄漏。
推荐阅读
- ruby-on-rails - Ruby 版本与安装版本不同
- python-3.x - 获取python的运行时错误(Google Code Jam)
- npm - 安装 webpack ^4.42.1 给了我不推荐使用的警告
- ios - 如何配置 React Native 图像选择器样式?
- javascript -
- c# - How to compare two dates in same DataGridView column
- excel - 用合并和未合并的单元格换行工作表的文本
- html - How to implement an app layout with header + scrollable sidebar + scrollable content using CSS and HTML only
- java - how do i run cmd command on android programmatically with java code
- algorithm - Vector insertion in Binary Search Tree in linear time complexity