我正在处理一个相当困惑的库(客户端/服务器应用程序),它在某处有内存泄漏,但我找不到位置。
当我启动库并让它完成工作时,我在完成时使用 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 的内存,没有真正的泄漏。 可能没有“真正的”泄漏,但正常情况下库应该在这种状态下释放所有资源。我看不到代码中有任何未释放的部分。
我怎样才能找到资源分配的位置?
最佳答案
您可以使用强力方法并在每次分配之前和每次删除之后打印到日志文件。
您可能想要打印对象的大小(或分配的大小)以及对象的名称。
您正在寻找匹配对、分配和解除分配。
您可能还想打印出有助于匹配的调用编号,即如果有 4 次分配调用,您应该能够找到与分配 #3 匹配的释放 #3。
这需要仔细检查代码以验证是否已识别所有分配。
关于c++ - Valgrind:我的内存泄漏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116758/