【发布时间】:2014-01-20 12:17:40
【问题描述】:
根据 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;
您可能会说,我有一个树结构,其中树对象有一个根,一个节点有多个子。在这部分代码中,树被展开到顶部;旧根成为新节点的子节点,然后新节点成为新根。 tree 是 Tree*,root 成员是 Node 指针,children 是 Node 指针数组。
现在 Valgrind 告诉我上面分配的内存 malloc 丢失了,但据我了解,我指的是新根中的内存块,而旧根则保留为新根的子级。
在我的程序结束时,我递归地释放树中所有节点的内存(通过递归下降到所有子节点,从 root 开始),所以我很确定内存最终会被释放.
我错过了什么吗?有没有办法从 Valgrind 获得更详细的信息,以了解到底发生了什么(未发生)?
【问题讨论】:
-
也许,向我们展示释放功能会很有用。另外,您使用哪些选项来运行 valgrind?
-
你能提供valgrind的输出吗?还要确保在 valgrind 输出中区分
definitly lost和maybe lost。 -
谁在你之前指向
otherNode,现在那个指针指向哪里? -
@KirilKirov 哇,真不敢相信我以前没想到这一点。这确实是释放功能。当我愉快地将树降到叶子并正确释放它们时,我完全忘记了释放节点本身。这解决了所有内存泄漏问题——比我预期的要简单得多。谢谢你让我看那里! ^^ 而我对 Valgrind 的所有疑虑顿时烟消云散了。
-
@poke - 很高兴能提供帮助:)。 valgrind 的 memcheck 基本上做的是 - 监控每个内存分配以及分配的内存是否在以后被释放。如果它没有被释放,它会告诉你它是在哪里分配的,因为它不能告诉你它应该在哪里被释放。这就是我要求释放功能的原因。
标签: c memory-leaks valgrind