内存泄漏与c ++中的动态mpfr变量数组

时间:2013-11-19 12:32:29

标签: c++ memory-leaks dynamic-memory-allocation dynamic-arrays multiprecision

我有一个简单的c ++程序,使用多精度库MPFR编写,试图在更大的程序中理解内存问题:

int main() {

  int prec=65536, size=1, newsize=1;
  mpfr_t **mf;

  while(true) {

    size=newsize;
    mf=new mpfr_t*[size];
    for(int i=0;i<size;i++) {
        mf[i]=new mpfr_t[size];
        for(int j=0;j<size;j++) mpfr_init2(mf[i][j], prec);
    }

    cout << "Size of array: ";
    cin >> newsize;

    for(int i=0;i<size;i++) {
        for(int j=0;j<size;j++) mpfr_clear(mf[i][j]);
        delete [] mf[i];
    }
    delete [] mf;
  }
}

这里的要点是声明不同大​​小的数组并使用任务管理器监视内存使用情况(我正在使用Windows)。这适用于尺寸〜&lt; 200但是如果我声明更大的东西,当我再次减小尺寸时,内存似乎不会被释放。

这是一个示例运行: 我启动程序并选择大小50.然后我在50,100,150和200之间更改大小,并按预期方式查看内存使用情况。然后我选择大小250并且内存使用率按预期上升但是当我回到200时它不会减少但是增加到类似于大小200和250所需的内存值之和。可以看到更大尺寸的类似行为。

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:1)

Process Explorer 将为您提供比任务管理器更真实的流程内存使用情况(虚拟大小)视图。内存泄漏是指一个程序没有释放内存,如果这种情况一直发生,它的内存永远不会停止增加。

Windows不一定会将程序的内存释放回系统本身 - 因此任务管理器等不会告诉你全部真相。

要检测visual studio中的内存泄漏,您可以启用_CRTDBG_MAP_ALLOC宏,如this MSDN page所述。

此外this question还谈到了如何使用C ++ new关键字。