如何查找是否有内存泄漏

Ins*_*oop 7 c++ memory-leaks

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

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

似乎程序慢慢占用内存所以我怀疑内存泄漏.我曾尝试过来自英特尔的Clang和Pointer Checker的Address Sanitizer,但他们没有找到任何东西.

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

所以它正在逐渐消失,但不是常规模式.我应该如何信任"top"中的内存使用情况?

内存碎片可以增加内存使用而不会出现内存泄漏吗?


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

  1. 在第一个循环中,程序需要150 MB
  2. 2小时后,在68次循环后,程序需要220 MB
  3. 一晚和394循环后,该程序需要480 MB

因此,似乎分配和释放内存(大约120 MB)的函数似乎每次调用时"泄漏"1 MB.

Mar*_*k B 6

首先,确保在很长一段时间内(例如,如果一次迭代需要一分钟,运行几个小时),增长将继续.如果增长为asyptotes则没有问题.接下来我会试试valgrind.然后,如果这没有帮助,你将不得不二进制搜索你的代码:注释掉位,直到增长停止.我将首先完全删除MKL库的使用(如果你愿意,留下存根),看看会发生什么.接下来,将您的向量更改为std::vector仅查看是否有帮助.在那之后你将不得不使用你的判断.