使用SIGINT停止进程时的Valgrind输出

时间:2015-04-21 07:24:28

标签: c++ memory-leaks valgrind

我们有一个巨大的应用程序,其中某些部分(线程)不执行干净关闭,因此内存未在析构函数中显式释放,因为它们从未被调用。所以我正在使用valgrind测试应用程序,方法是使用Ctrl + C(SIGINT)命令中断进程,该命令以某种方式停止进程。 Valgrind显示出大量泄漏(绝对可能泄露)。我正在使用以下选项运行valgrind

valgrind --leak-check=full --log-file="valgrind5.out" -v ./MyProcess

我对此有两个问题

  1. 在valgrind输出中,我可以看到非常多的跟踪输出
  2. 的跟踪

    == 2833 = = 99个街区中的3,330个字节肯定会在34,381的损失记录33,556中丢失 == 2833 = = 58个街区中的3,337个字节可能在损失记录33,557中丢失34,381

    在这种情况下,当使用SIGINT停止进程时内存泄漏时,我可以考虑“绝对丢失”吗?

    1. 只有在进程停止后,Valgrind才会根据未初始化的变量转储有关泄漏和跳转的所有信息。我假设valgrind可以在运行时检测到“肯定丢失”的内存泄漏,并立即打印在控制台或valgrind日志文件中。假设错了吗?

1 个答案:

答案 0 :(得分:1)

正如Orel所提到的,无论您的应用程序正常终止还是被SIGINT中断,“绝对丢失”确实是相关的。 但是,valgrind一看到它就不会显示泄漏。我认为这是因为检测泄漏可能需要一些时间,而且不应该经常进行。 如果您想尽快显示所有泄漏,您可以尝试使用Boehm-Weiser垃圾收集库(http://www.hboehm.info/gc/),使其实际上不会释放内存,只需报告它的想法不再是可访问的对象。 这当然是一项非常重要的工作,但它可能是值得的。

您也可以开始使用unique_ptr<>和shared_ptr<>多一点,以便自动释放内存。并且还将事物包装在类中,例如以确保析构函数释放内存并关闭文件句柄。