我创建了一个二进制搜索树,我认为它很好,直到我开始尝试将其用于集合实现为止。我遇到了一些问题,这些问题似乎是在将节点添加到树中时发生的。我已经对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:如何避免这种情况发生?我很高兴发布您认为需要回答此问题的任何代码,但我不确定从哪里开始。希望这可以使某人朝正确的方向发展。
编辑:我应该提到这是一个学校项目,因此任何“怪异”的事情,例如不需要的bool函数和其他事物。在假设我正在做不需要做的事情之前,请先询问。
编辑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);
}
}
答案 0 :(得分:0)
我实际上发现了问题。以下行是我发布的最后一段代码:
ineffectives[move] = Set<string>();
这是不必要的,会导致泄漏,因为当我声明
HashMap<string, Set<string>>
它已经创建了所有字符串集。当我删除该行时,它可以正常工作而不会泄漏。