首页 > 解决方案 > 将节点设置为新节点()时的内存泄漏

问题描述

我创建了一个我认为工作正常的二叉搜索树,直到我开始尝试将它用于集合实现。我遇到了一些内存泄漏的问题,这些内存泄漏似乎是在向树中添加节点时发生的。我已经推断出我的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 内存泄漏

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

标签: c++binary-search-tree

解决方案


我确实发现了问题。以下行在我发布的最后一段代码中:

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

这是 uneccesary 并导致泄漏,因为当我声明

HashMap<string, Set<string>>

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


推荐阅读