我们有一个巨大的应用程序,其中某些部分(线程)不执行干净关闭,因此内存未在析构函数中显式释放,因为它们从未被调用。所以我正在使用valgrind测试应用程序,方法是使用Ctrl + C(SIGINT)命令中断进程,该命令以某种方式停止进程。 Valgrind显示出大量泄漏(绝对可能泄露)。我正在使用以下选项运行valgrind
valgrind --leak-check=full --log-file="valgrind5.out" -v ./MyProcess
我对此有两个问题
== 2833 = = 99个街区中的3,330个字节肯定会在34,381的损失记录33,556中丢失 == 2833 = = 58个街区中的3,337个字节可能在损失记录33,557中丢失34,381
在这种情况下,当使用SIGINT停止进程时内存泄漏时,我可以考虑“绝对丢失”吗?
答案 0 :(得分:1)
正如Orel所提到的,无论您的应用程序正常终止还是被SIGINT中断,“绝对丢失”确实是相关的。 但是,valgrind一看到它就不会显示泄漏。我认为这是因为检测泄漏可能需要一些时间,而且不应该经常进行。 如果您想尽快显示所有泄漏,您可以尝试使用Boehm-Weiser垃圾收集库(http://www.hboehm.info/gc/),使其实际上不会释放内存,只需报告它的想法不再是可访问的对象。 这当然是一项非常重要的工作,但它可能是值得的。
您也可以开始使用unique_ptr<>和shared_ptr<>多一点,以便自动释放内存。并且还将事物包装在类中,例如以确保析构函数释放内存并关闭文件句柄。