Valgrind:我的记忆泄漏在哪里?

时间:2014-03-01 16:11:06

标签: c++ memory memory-leaks valgrind

我正在研究一个相当混乱的库(客户端/服务器应用程序),它在某处有内存泄漏,但我找不到。

当我启动库并让它完成工作时,我在完成时使用top获得以下内存使用情况:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            
21010 root      20   0  111m  12m 6836 S  0.0  0.7   0:29.20 myapp
21008 root      20   0  172m  99m 6480 S  0.0  5.8   0:14.39 myapp

第一行是客户端,第二行是服务器。 我让valgrind执行服务器并得到以下结果:

==20904== 
==20904== HEAP SUMMARY:
==20904==     in use at exit: 4,723,124 bytes in 199 blocks
==20904==   total heap usage: 40,423,345 allocs, 40,423,146 frees, 1,977,998,844 bytes allocated
==20904== 
==20904== LEAK SUMMARY:
==20904==    definitely lost: 0 bytes in 0 blocks
==20904==    indirectly lost: 0 bytes in 0 blocks
==20904==      possibly lost: 914 bytes in 18 blocks
==20904==    still reachable: 4,722,210 bytes in 181 blocks
==20904==         suppressed: 0 bytes in 0 blocks
==20904== Rerun with --leak-check=full to see details of leaked memory
==20904== 
==20904== For counts of detected and suppressed errors, rerun with: -v
==20904== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 2 from 2) Killed

如果我理解正确的话,valgrind说服务器只有大约4,7M的内存仍然分配没有真正的泄漏。 可能是没有“真正的”泄漏,但通常图书馆应该在这个状态下释放所有资源。我无法在代码中看到任何未释放内容的部分。

如何找出仍然分配资源的位置?

1 个答案:

答案 0 :(得分:0)

您可以使用强力方法并在每次分配之前和每次删除之后打印到日志文件。

您可能希望打印对象的大小(或分配的大小)以及对象的名称。

您正在寻找匹配对,分配和释放。

您可能还想打印出有助于匹配的调用号,即如果有4次调用调用,您应该能够找到释放#3以匹配分配#3。

这需要仔细检查代码以验证是否已识别所有分配。