我正在研究一个相当混乱的库(客户端/服务器应用程序),它在某处有内存泄漏,但我找不到。
当我启动库并让它完成工作时,我在完成时使用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的内存仍然分配没有真正的泄漏。 可能是没有“真正的”泄漏,但通常图书馆应该在这个状态下释放所有资源。我无法在代码中看到任何未释放内容的部分。
如何找出仍然分配资源的位置?
答案 0 :(得分:0)
您可以使用强力方法并在每次分配之前和每次删除之后打印到日志文件。
您可能希望打印对象的大小(或分配的大小)以及对象的名称。
您正在寻找匹配对,分配和释放。
您可能还想打印出有助于匹配的调用号,即如果有4次调用调用,您应该能够找到释放#3以匹配分配#3。
这需要仔细检查代码以验证是否已识别所有分配。