根据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具有多个子节点。在这部分代码中,树被扩展到顶部;旧根成为新节点的子节点,然后该新节点成为新根节点。 tree
是Tree*
,root
成员是节点指针,children
是节点指针数组。
现在Valgrind告诉我,上面的malloc
分配的内存丢失了,但据我所知,我指的是来自新root的内存块,而旧的root被保存为新的根
在我的程序结束时,我递归地释放了树中所有节点的内存(通过递归降级到所有子节点,从root
开始),所以我很确定内存是最终获释。
我错过了什么吗?有没有办法从Valgrind那里获得更详细的信息,以找出究竟发生了什么(不是)?
答案 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
函数也很有用。