c++ - 如何查找我是否有内存泄漏

标签 c++ memory-leaks

我写了一个数字运算算法。这个想法是:

  1. 一个小的主程序需要很少的内存(从 2 MB 开始)
  2. 然后,在一个循环中,它调用一个需要相当多内存(大约 100 MB)的函数,该内存应该在函数结束时释放。为了了解发生了什么,现在总是使用相同的参数调用该函数。

程序似乎在慢慢吃内存所以我怀疑是内存泄漏。我已经尝试过 Clang 的 Address Sanitizer 和 Intel 的 Pointer Checker,但他们没有找到任何东西。

现在,我正在查看我的事件监视器中的内存消耗(我正在运行 OSX,但我从 Unix 命令“top”获得相同的内存使用情况)并且就在调用大函数之前,程序需要 2 MB。运行函数时,程序占用 120 MB。奇怪的是,当程序结束大函数并返回循环内部时,它现在占用了 37 MB!然后,当它返回到 big 函数时,它需要 130 MB。再次回到循环中,它需要 36 MB,然后在大函数中需要 140 MB...

所以它正在慢慢地漂移,但不是有规律的。我应该如何信任“top”中的内存使用情况?

内存碎片可以增加内存使用量而不发生内存泄漏吗?


我让程序运行了一夜,这是我得到的数据:

  1. 在第一个循环中,程序占用 150 MB
  2. 2 小时后,经过 68 次循环,程序占用 220 MB
  3. 经过一个晚上和 394 次循环后,程序占用 480 MB

因此看起来每次调用分配和释放内存(大约 120 MB)的函数似乎“泄漏”1 MB。

最佳答案

首先,确保在很长一段时间内(例如,如果一次迭代需要一分钟,运行几个小时)增长会持续。如果增长渐近线那么就没有问题。接下来我会尝试 valgrind。然后,如果这没有帮助,您将不得不对您的代码进行二进制搜索:注释掉一些位,直到增长停止。我将从完全删除 MKL 库的使用开始(如果需要,请保留 stub ),然后看看会发生什么。接下来,将您的 vector 更改为 std::vector 看看是否有帮助。之后,您将不得不使用自己的判断力。

关于c++ - 如何查找我是否有内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307350/

相关文章:

c++ - Groupbox 调整大小问题,顶部有单选按钮

tomcat - Grails ConfigSlurper 内存泄漏

c++ - C++程序中的内存泄漏

c++ - 接口(interface)是 C++ 中的一个好习惯吗?

c++ - 如何从 c/c++ 与 Oracle eBusiness 套件通信

linux - 程序是否需要退出才能让 Valgrind 工作?

ruby-on-rails - 递归 ruby​​ 方法中明显的内存泄漏

Linux 内核内存泄漏目前已修复

c# - c++0x 概念和 c# 约束有什么区别?

C++ 无序集内存不足