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 获取更详细的信息,以找出到底发生了什么(不)发生的事情?
什么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
Run Code Online (Sandbox Code Playgroud)
有时该verbose
功能也很有用。