理解Valgrind输出

10

我之前发过一篇帖子,询问如何检查内存泄漏等问题。我确实说过我对Linux终端不太熟悉,但有人告诉我使用Valgrind很容易。

我已经成功运行了它,但我不确定输出结果的意思。粗略地看,一切看起来都很好,但如果可能的话,我想请经验丰富的人确认一下。输出如下:

^C==2420==
==2420== HEAP SUMMARY:
==2420==     in use at exit: 2,240 bytes in 81 blocks
==2420==   total heap usage: 82 allocs, 1 frees, 2,592 bytes allocated
==2420==
==2420== LEAK SUMMARY:
==2420==    definitely lost: 0 bytes in 0 blocks
==2420==    indirectly lost: 0 bytes in 0 blocks
==2420==      possibly lost: 0 bytes in 0 blocks
==2420==    still reachable: 2,240 bytes in 81 blocks
==2420==         suppressed: 0 bytes in 0 blocks
==2420== Reachable blocks (those to which a pointer was found) are not shown.
==2420== To see them, rerun with: --leak-check=full --show-reachable=yes
==2420==
==2420== For counts of detected and suppressed errors, rerun with: -v
==2420== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 8)

这里一切都好吗?唯一让我担心的是“仍可访问”部分。那还可以吗?

3个回答

12

14
如果原帖作者不知道手册在哪里,这样的答案就没有用了。我试图给予人们怀疑的余地,尤其是因为原帖作者至少努力描述了问题。有时候,如果你对一个主题很陌生,特别是像内存管理这样潜在复杂的主题,技术文档可能会让人感到压抑,所以他们只需要指向正确的文档方向就可以了。 - mctylr

8
你粘贴的输出显示:
==2420== 总堆使用量: 82个分配,1个释放,已分配2,592字节 ... ==2420== 仍然可达: 81个块中的2,240字节
82次分配,只有1次释放,因此最终堆上仍有81个块是“可达”的。正如Valgrind FAQ所述,这可能表明代码使用了一些内存池分配器,因此不会立即释放未使用的内存,而是将其保留以供以后使用,或者实际上可能是内存泄漏(虽然不太可能)。请按照链接中的步骤检查是否由于STL使用内存缓存引起的。

1
由于问题标记为C,我假设C++ STL或String类对sbsp不是问题。好答案。 - mctylr

2
这可能对您有用:
使用Memcheck的内存泄漏检测器时,“definitely lost”、“indirectly lost”、“possibly lost”、“still reachable”和“suppressed”之间有什么区别?5.2.

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