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

Valgrind output when process is stopped using SIGINT

我们有一个巨大的应用程序,其中某些部分(线程)没有完全关闭,因此在析构函数中没有显式释放内存,因为它们从未被调用过。因此,我通过使用 Ctrl + C(SIGINT) 命令以某种方式停止进程来中断进程,从而使用 valgrind 测试应用程序。 Valgrind 显示大量泄漏(肯定且可能泄漏)。我是 运行 valgrind,具有以下选项

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

关于这个我有两个问题

  1. 并且在 valgrind 输出中我可以看到大量跟踪输出如下

==2833== 3330 bytes in 99 blocks 在丢失记录33,556 of 34,381中肯定丢失 ==2833== 58个块中的3,337个字节可能丢失在丢失记录33,557 of 34,381

在这种情况下,当使用 SIGINT 停止进程时,我可以将 "definitely lost" 视为内存泄漏吗?

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

正如 Orel 所提到的,"definitely lost" 确实与您的应用程序是正常终止还是被 SIGINT 中断有关。 但是,valgrind 不会在看到泄漏时立即显示它们。我认为这是因为检测泄漏可能需要时间,而且不应经常进行。 如果你想尽快显示所有泄漏,你可以尝试使用 Boehm-Weiser 垃圾收集库(http://www.hboehm.info/gc/),在这种模式下它实际上不会释放内存,而只是报告它的想法不再是可访问的对象。 这当然是一个不平凡的努力,但它可能是值得的。

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