4

我的代码中有内存泄漏。随着流的触发,堆继续增加。在我的代码中,我有一个 while(1) 循环,它基本上在队列中等待。当从 web 服务触发该流时,传入的 msg 被推送到队列中,并调用 c++ 中的一个方法,该方法获取消息并以图形的形式实现流。

对于每个触发器,我发现堆中的内存增加了 604kb。我需要解决这个问题。

我停止了服务 [在产品中运行的二进制文件]。

我用 valgrind 启动了服务 [将二进制文件作为 valgrind 的输入]

valgrind  --log-file=/home/valgrind-output.txt --leak-check=full <service binary>

但是,当二进制文件运行时,它不会显示任何泄漏,只有当我停止服务时,我才会看到一些泄漏。但这些是一次性泄漏,一旦我们重新启动服务就会被清除。[二进制]。

当每个流程被触发时,我有意在流程开始时添加了一个分配。

 int *p = new int[10];

并添加了一个日志。每次触发流程时,我都会看到日志打印。但我没有看到 valgrind 在输出文件中出现任何泄漏。

如何检查每个流调用之间的泄漏?valgrind 是否仅在调用 main 结束时才消除泄漏?在这种情况下,如何动态检查我的代码导致了什么泄漏。如果我需要安装任何其他检测器?请建议。这会很有帮助。谢谢。

4

2 回答 2

2

valgrind 仅在程序退出时检查内存泄漏。此时,它会跟踪从堆栈和全局变量中可访问的所有内存,并且任何无法访问的内容都被认为是泄漏。

如果你想在一个长时间运行的程序中发现泄漏,你需要插入一个退出调用(中止程序),它会在它运行一段时间后发生,它会告诉你当时有什么泄漏。

于 2013-03-01T06:50:28.940 回答
-2

使用 -massif 它会为您提供详细的输出,其中内存正在与所有调用堆栈一起分配。

于 2013-03-01T06:48:01.277 回答