使用Valgrind追踪内存泄漏

时间:2014-01-20 12:17:41

标签: c memory-leaks valgrind

根据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;

正如您可能知道的那样,我有一个树结构,其中树对象具有单个根,并且Node具有多个子节点。在这部分代码中,树被扩展到顶部;旧根成为新节点的子节点,然后该新节点成为新根节点。 treeTree*root成员是节点指针,children是节点指针数组。

现在Valgrind告诉我,上面的malloc分配的内存丢失了,但据我所知,我指的是来自新root的内存块,而旧的root被保存为新的根

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

我错过了什么吗?有没有办法从Valgrind那里获得更详细的信息,以找出究竟发生了什么(不是)?

1 个答案:

答案 0 :(得分:3)

监视内存泄漏的valgrind memcheck(默认工具)基本上用于监视每个内存分配以及以后是否释放分配的内存。如果它没有被释放,它会显示它被分配的位置,因为它无法显示它应该被释放的位置。

我的观点是 - 即使分配/添加功能似乎很好,我们/你应该看看释放功能。最有可能的是,根据你问题中的信息存在问题。

另一件可能有用的事情是:你如何运行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

有时verbose函数也很有用。