0

我有一个简单的 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)。这适用于大小〜< 200,但如果我声明更大的东西,当我再次减小大小时,内存似乎不会被释放。

下面是一个示例运行:我启动程序并选择大小 50。然后我在 50、100、150 和 200 之间更改大小,并看到内存使用量按预期上下波动。然后我选择大小 250,内存使用量按预期上升,但是当我回到 200 时,它并没有减少,而是增加到类似于大小分别为 200 和 250 所需的内存值的总和。较大的尺寸也会出现类似的行为。

知道发生了什么吗?

4

1 回答 1

1

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

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

要检测 Visual Studio 中的内存泄漏,您可以启用_CRTDBG_MAP_ALLOC宏,如此 MSDN page中所述。

这个问题也谈到了使它与 C++new关键字一起工作。

于 2013-11-19T12:55:38.347 回答