将节点设置为新Node()时发生内存泄漏

时间:2019-04-05 18:50:05

标签: c++ binary-search-tree

我创建了一个二进制搜索树,我认为它很好,直到我开始尝试将其用于集合实现为止。我遇到了一些问题,这些问题似乎是在将节点添加到树中时发生的。我已经对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运行它时,这是我得到的输出。

Valgrind Memory Leak

我有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);
    }
}

1 个答案:

答案 0 :(得分:0)

我实际上发现了问题。以下行是我发布的最后一段代码:

ineffectives[move] = Set<string>();

这是不必要的,会导致泄漏,因为当我声明

HashMap<string, Set<string>>

它已经创建了所有字符串集。当我删除该行时,它可以正常工作而不会泄漏。