【发布时间】:2014-04-02 17:31:14
【问题描述】:
我正在研究一个相当混乱的库(客户端/服务器应用程序),它在某处有内存泄漏,但我找不到哪里。
当我启动库并让它工作时,我在完成时使用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 的内存,没有真正的泄漏。 可能没有“真正的”泄漏,但通常库应该在这种状态下释放所有资源。我看不到代码中没有释放某些东西的任何部分。
我怎样才能知道资源仍然分配在哪里?
【问题讨论】:
-
按照 valgrind 的建议使用
--leak-check=full。但是,valgrind 说您没有传统的内存泄漏。退出应用时,您只有 4MB 尚未释放。 -
我做到了,但据我所知,这只是告诉我上述 1MB 的“可能”泄漏,还是我错了?
-
然后使用 --show-reachable=yes 运行
-
当应用程序处于完成状态(并且使用 100MB RAM)时,我使用 CTRL+C 退出了应用程序。我认为它会显示分配的 100MB 的结果
-
不,不会。您请求的内存(使用例如 malloc())可能永远不会返回给操作系统,即使您的 free() 它也可能永远不会返回到操作系统,直到您的应用程序退出。您可以将 100MB 分配给您的进程,而无需您的应用实际使用它。 malloc 子系统通常保留内存以供将来重用,并且很少(如果有的话)将其返回给操作系统。
标签: c++ memory memory-leaks valgrind