c++ - Valgrind:我的内存泄漏在哪里?

标签 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 的内存,没有真正的泄漏。 可能没有“真正的”泄漏,但正常情况下库应该在这种状态下释放所有资源。我看不到代码中有任何未释放的部分。

我怎样才能找到资源分配的位置?

最佳答案

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

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

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

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

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

关于c++ - Valgrind:我的内存泄漏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22116758/

相关文章:

c++ - 配置工厂构建的对象的正确模式

java - 通过搜索堆转储以编程方式查找正在运行的 Java 应用程序的值等的 VisualVM 等软件的替代方案?

c++ - SerialStream.Open ("/dev/ttyUSB0"的实例)引发异常 "Bad file descriptor"[libserial, lubunto, c++]

c++ - 将二维动态数组传递给 C++ 中的函数

c - 在 C 中,变量如何与其值相关联?

c - C 中的动态字符串矩阵

C++ 调试帮助内存泄漏

javascript - 非常简单的 Ember 1.13.3 应用程序中的路由转换内存泄漏

python - 使用python-c-api时调试PyObject泄漏

c++ - 将 Depthbuffer 和 TextureBuffer 发送到同一个 Fragment OpenGL3