【问题标题】:Valgrind: Where is my memory leak?Valgrind:我的内存泄漏在哪里?
【发布时间】: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


【解决方案1】:

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

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

您正在寻找匹配对、分配和解除分配。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 2013-06-24
    • 2023-03-16
    相关资源
    最近更新 更多