gpt4 book ai didi

c - 使用 Valgrind 追踪内存泄漏

转载 作者:行者123 更新时间:2023-11-30 18:41:30 26 4
gpt4 key购买 nike

根据 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 获取更详细的信息,以了解到底发生了什么(没有发生)?

最佳答案

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

我的观点是 - 即使分配/添加函数看起来不错,我们/你也应该看看释放函数。根据您问题中的信息,问题很可能就在那里。

另一件事,可能有用的是:你如何运行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 函数也很有用。

关于c - 使用 Valgrind 追踪内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com