Valgrind和内存泄漏

6

我正在对我的软件进行一些内存分析,在运行了valgrind以下命令的标准内存泄漏检查后:

valgrind --tool=memcheck --leak-check=full ./path_to_program

我得到了以下总结:
==12550== 内存泄漏汇总: ==12550== 明确泄漏: 7个块中的597,170字节 ==12550== 间接泄漏: 10个块中的120字节 ==12550== 可能泄漏: 1,455个块中的770,281字节 ==12550== 仍然可访问: 2,319个块中的181,189字节 ==12550== 抑制的: 0个块中的0字节 ==12550== 不显示可访问块(已找到指针的块)。 若要查看它们,请重新运行:--leak-check=full --show-reachable=yes ==12550== ==12550== 要检测到和抑制错误的计数,请使用-v重新运行。 ==12550== 错误摘要:来自325个上下文的325个错误(抑制:来自11个上下文的176个)
这不太好,所以我的问题是:
为什么我的程序没有崩溃,即使有这些内存泄漏?
而且definitely lost、indirectly lost、possibly lost和still reachable有什么区别?我该如何尝试修复它们?

4
为什么你会预料它会爆炸? - Oliver Charlesworth
@OliCharlesworth 因为它有许多已分配但未释放的内存。 - Matteo
@Matteo:最多也就几 MB,除非你在非常受限制的环境下,否则没有理由会“爆炸”。 - Mat
2
真正的泄漏,尽可能避免。但是,期望程序在出现泄漏时崩溃并不合理。(这也是使泄漏跟踪困难的原因之一 - 小泄漏通常比大泄漏更难以确定其位置。) - Mat
1
当你意识到内存泄漏时,你应该立即修复它们。除了内存不足和性能问题外,泄漏还可以突出显示其他你不知道的错误。然而,更多与分配相关的崩溃(爆炸)发生在你保留已释放的内存时,而不是当你失去对分配的跟踪时。从这个内存中读取和写入会导致未定义的行为。 - John McFarlane
显示剩余3条评论
1个回答

17

我建议访问Valgrind FAQ

使用Memcheck的内存泄漏检测器时,“definitely lost”、“indirectly lost”、“possibly lost”、“still reachable”和“suppressed”的区别是什么?

详细信息在用户手册的Memcheck部分中。

简而言之:

  • “definitely lost”表示您的程序正在泄漏内存 - 请修复这些泄漏!

  • “indirectly lost”表示您的程序在基于指针的结构中泄漏内存(例如,如果二叉树的根节点被“definitely lost”,则所有子节点都将被视为“indirectly lost”)。如果您修复了“definitely lost”泄漏,则“indirectly lost”泄漏应该会消失。

  • “possibly lost”表示您的程序正在泄漏内存,除非您对指针进行了不寻常的操作,可能导致它们指向已分配块的中间位置。请参见用户手册以获取一些可能的原因。如果您不想看到这些报告,请使用--show-possibly-lost=no

  • “still reachable”表示您的程序可能没问题 - 它没有释放一些本应该释放的内存。这很常见,通常是合理的。如果您不想看到这些报告,请不要使用--show-reachable=yes

  • “suppressed”表示泄漏错误已被抑制。默认压制文件中有一些压制。您可以忽略被压制的错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接