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

C++ 使用SIGINT停止进程时的Valgrind输出,c++,memory-leaks,valgrind,C++,Memory Leaks,Valgrind,我们有一个巨大的应用程序,其中一些部分(线程)没有完全关闭,因此在析构函数中没有显式释放内存,因为它们从未被调用。因此,我使用valgrind测试应用程序,方法是使用Ctrl+C(SIGINT)命令中断进程,该命令以某种方式停止进程。Valgrind显示出大量泄漏(肯定和可能泄漏)。我正在使用以下选项运行valgrind valgrind --leak-check=full --log-file="valgrind5.out" -v ./MyProcess 关于这一点,我有两个问题 在valg

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

valgrind --leak-check=full --log-file="valgrind5.out" -v ./MyProcess
关于这一点,我有两个问题

  • 在valgrind的输出中,我可以看到大量的跟踪输出
  • ==2833==33381的丢失记录33556中99个块中的3330字节肯定丢失 ==2833==34381的丢失记录33557中,58个块中的3337字节可能丢失

    在这种情况下,当使用SIGIN停止进程时,是否可以考虑“绝对丢失”作为内存泄漏?

  • Valgrind仅在进程停止后才基于未初始化的变量转储有关泄漏和跳转的所有信息。我假设valgrind可以在运行时检测到“肯定丢失”的内存泄漏,并立即打印在控制台或valgrind日志文件上。这个假设错了吗
  • 正如Orel所提到的,无论您的应用程序是正常终止还是被SIGINT中断,“绝对丢失”确实是相关的。 然而,valgrind不会在看到泄漏后立即显示。我认为这是因为检测泄漏可能需要时间,不应该太频繁。 如果希望尽快显示所有泄漏,可以尝试使用Boehm Weiser垃圾收集库(),这样它实际上不会释放内存,而只是报告它认为不再可访问的对象。 这当然是一项非同寻常的努力,但它可能是值得的


    您还可以开始更多地使用unique_ptr和shared_ptr,以便自动释放内存。还可以将内容包装到类中,例如,确保析构函数释放内存并关闭文件句柄。

    您需要在程序中捕获sigint以调用关机部分。内存泄漏肯定会丢失,这是没有指针指向的内存。Steal-reachable可以用您的野蛮停止来解释。@Ôrel这是一个由许多开发人员处理的大型应用程序,因此SIGINT在到达我们的应用程序之前就消失了,我们被迫停止更新。由于我们的代码库很大,由许多具有不同技能的开发人员开发,并且滥用C++11(如lambdas),即使使用unique_ptr和shared_ptr,也会产生一些问题,例如访问无效内存。不过,我很想知道shared_ptr中的这种情况?根据定义,当至少有一个这样的ptr时,它们不会释放内存。如果您只想监视内存,而不想阻止其释放,那么可以将其与弱_ptr结合使用。在这种情况下,当释放内存时,指针将重置为null。我观察到的一个问题是在异步执行的lambda中通过引用传递shared_ptr。所以,当lambda被调用时,由shared_ptr指向的对象不再存在