使用 Valgrind 追踪内存泄漏

pok*_*oke 1 c valgrind memory-leaks

根据 Valgrind 的说法,我的程序中有相当大的内存泄漏,但实际上我不认为是这样。或者也许我只是不知道某些事情。我是第一次使用 Valgrind,所以我可能解释错了,或者可能把它看得太重了。

无论如何,Valgrind 告诉我 ~13 MB(直接 56 字节,其余间接)肯定会丢失。有问题的代码如下所示:

Node* newRoot = malloc(sizeof(Node));
newRoot->children[0] = tree->root;
newRoot->children[1] = otherNode;
newRoot->k = 2;

tree->root = newRoot;
Run Code Online (Sandbox Code Playgroud)

您可能会说,我有一个树结构,其中树对象有一个根,一个节点有多个子节点。在这部分代码中,树被扩展到顶部;旧根成为新节点的子节点,然后成为新根。tree是 a Tree*root成员是一个节点指针,并且children是一个节点指针数组。

现在 Valgrind 告诉我上面分配的内存malloc丢失了,但在我的理解中,我从新根指向那个内存块,而旧根作为新根的子级保留。

在我的程序结束时,我递归地释放树中所有节点的内存(通过递归下降到所有子节点,从 开始root),所以我很确定内存最终被释放。

我错过了什么吗?有没有办法从 Valgrind 获取更详细的信息,以找出到底发生了什么(不)发生的事情?

Kir*_*rov 5

什么valgrindmemcheck(默认工具)基本上不用于监视内存泄漏是-监控每个内存分配和是否已分配的内存被释放后。如果它没有被释放,它会显示它被分配到的位置,因为它无法显示它应该被释放的位置。

我的观点是 - 即使分配/添加功能看起来不错,我们/你也应该看看释放功能。根据您问题中的信息,最有可能的是问题所在。

另一件可能有用的事情是:你怎么跑valgrind?我使用以下选项:

valgrind --trace-children=yes --track-fds=yes --log-fd=2 --error-limit=no \
         --leak-check=full --show-possibly-lost=yes --track-origins=yes \
         --show-reachable=yes executable executable_arguments_if_any
Run Code Online (Sandbox Code Playgroud)

有时该verbose功能也很有用。

  • 我实际上忘记在我的释放函数中释放内部节点,所以错误实际上是有道理的。修复它修复了所有内存泄漏 :) – 我现在只是使用 `--leak-check=yes` 但我肯定也会检查其他选项。非常感谢!:) (2认同)