Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用Valgrind跟踪内存泄漏_C_Memory Leaks_Valgrind - Fatal编程技术网

C 使用Valgrind跟踪内存泄漏

C 使用Valgrind跟踪内存泄漏,c,memory-leaks,valgrind,C,Memory Leaks,Valgrind,根据Valgrind的说法,我的程序中有一个相当大的内存泄漏,但我实际上不认为是这样。或者我只是不知道什么。我第一次使用Valgrind,所以我可能对它的解释是错误的,或者可能对它太认真了 无论如何,Valgrind告诉我~13MB 56字节的直接数据,其余的间接数据肯定丢失了。所讨论的代码如下所示: Node* newRoot = malloc(sizeof(Node)); newRoot->children[0] = tree->root; newRoot->childre

根据Valgrind的说法,我的程序中有一个相当大的内存泄漏,但我实际上不认为是这样。或者我只是不知道什么。我第一次使用Valgrind,所以我可能对它的解释是错误的,或者可能对它太认真了

无论如何,Valgrind告诉我~13MB 56字节的直接数据,其余的间接数据肯定丢失了。所讨论的代码如下所示:

Node* newRoot = malloc(sizeof(Node));
newRoot->children[0] = tree->root;
newRoot->children[1] = otherNode;
newRoot->k = 2;

tree->root = newRoot;
正如您可能知道的,我有一个树结构,其中树对象有一个根,一个节点有多个子节点。在这部分代码中,树被扩展到顶部;旧根成为新节点的子节点,然后新节点成为新根。树是树*,根成员是节点指针,子成员是节点指针数组

现在Valgrind告诉我,用上面的malloc分配的内存丢失了,但在我的理解中,我指的是来自新根的内存块,而旧根作为新根的子级保留

在我的程序结束时,我递归地释放树中所有节点的内存,从根开始,递归地下降到所有子节点,因此我非常确定内存最终会被释放

我错过什么了吗?有没有办法从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
有时详细功能也很有用。

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

有时详细函数也很有用。

也许,向我们展示释放函数会很有用。另外,您使用什么选项来运行valgrind?您可以提供valgrind输出吗。还要确保在valgrind输出中明确丢失和可能丢失之间有所不同。在您之前谁在指向其他节点,现在该指针指向何处?@KirilKirov哇,真不敢相信我以前没有想到这一点。这确实是释放功能。当我高兴地将树降到叶子上并正确地释放它们时,我完全忘记了释放节点本身。修复所有内存泄漏比我预期的要简单得多。谢谢你让我看那里!^^我对瓦尔格兰德的所有怀疑都突然消失了。@poke-很高兴能帮上忙:。valgrind的memcheck的基本功能是监视每个内存分配以及分配的内存是否在以后释放。如果它没有被释放,它会向您显示它被分配的位置,因为它不能向您显示它应该被释放的位置。这就是为什么我需要释放函数。也许,向我们展示释放函数会很有用。另外,您使用什么选项来运行valgrind?您可以提供valgrind输出吗。还要确保在valgrind输出中明确丢失和可能丢失之间有所不同。在您之前谁在指向其他节点,现在该指针指向何处?@KirilKirov哇,真不敢相信我以前没有想到这一点。这确实是释放功能。当我高兴地将树降到叶子上并正确地释放它们时,我完全忘记了释放节点本身。修复所有内存泄漏比我预期的要简单得多。谢谢你让我看那里!^^我对瓦尔格兰德的所有怀疑都突然消失了。@poke-很高兴能帮上忙:。valgrind的memcheck的基本功能是监视每个内存分配以及分配的内存是否在以后释放。如果它没有被释放,它会向您显示它被分配的位置,因为它不能向您显示它应该被释放的位置。这就是我要求释放函数的原因。我实际上忘记了释放释放函数中的内部节点,所以错误是有意义的。修复所有内存泄漏:–我刚刚使用了-leak check=yes,但我肯定也会检查其他选项。非常感谢实际上我忘了释放内部节点 s在我的释放函数中,所以错误实际上是有意义的。修复所有内存泄漏:–我刚刚使用了-leak check=yes,但我肯定也会检查其他选项。非常感谢