我写了一个数字运算算法。这个想法是:
- 一个小的主程序需要很少的内存(从 2 MB 开始)
- 然后,在一个循环中,它调用一个需要相当多内存(大约 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”中的内存使用情况?
内存碎片可以增加内存使用量而不发生内存泄漏吗?
我让程序运行了一夜,这是我得到的数据:
- 在第一个循环中,程序占用 150 MB
- 2 小时后,经过 68 次循环,程序占用 220 MB
- 经过一个晚上和 394 次循环后,程序占用 480 MB
因此看起来每次调用分配和释放内存(大约 120 MB)的函数似乎“泄漏”1 MB。
最佳答案
首先,确保在很长一段时间内(例如,如果一次迭代需要一分钟,运行几个小时)增长会持续。如果增长渐近线那么就没有问题。接下来我会尝试 valgrind
。然后,如果这没有帮助,您将不得不对您的代码进行二进制搜索:注释掉一些位,直到增长停止。我将从完全删除 MKL
库的使用开始(如果需要,请保留 stub ),然后看看会发生什么。接下来,将您的 vector 更改为 std::vector
看看是否有帮助。之后,您将不得不使用自己的判断力。
关于c++ - 如何查找我是否有内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307350/