根据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
成员是Node指针,并且children
是Node指针的数组。
现在,Valgrind告诉我,上面分配的内存malloc
丢失了,但是据我理解,我指的是新根目录下的内存块,而旧根目录则保留为新根目录的子级。
在程序结束时,我将以递归方式释放树中所有节点的内存(通过从处开始递归地下降到所有子节点中root
),因此,我很确定内存最终会被释放。
我想念什么吗?有没有办法从Valgrind获得更详细的信息,以查明到底是什么(没有)发生了什么?
什么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
功能也可能有用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句