【问题标题】:Memory leak with dynamic array of mpfr variables in c++C++ 中 mpfr 变量动态数组的内存泄漏
【发布时间】:2013-12-03 00:21:43
【问题描述】:

我有一个简单的 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)。这适用于大小〜

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

知道发生了什么吗?

【问题讨论】:

  • Windows 不一定会将您的程序内存释放回系统本身——因此任务管理器不会告诉您全部真相。你当然不能用它来检测/监控这样的内存泄漏。
  • 这段代码没有内存泄漏(假设 mpfr_* 例程没有泄漏)。内存泄漏是指您的程序使用的内存较少,如果发生的只是系统可用的内存较少,那么这不是内存泄漏。
  • @noelicus 哦,我明白了.. 还有另一种方法可以在不使用 Windows IDE 的情况下检查内存使用情况吗?我正在使用 cygwin,但似乎命令 'top' 不可用。约翰:哦,我想我用错名字了

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


【解决方案1】:

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

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

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

this question 还谈到了如何使其与 C++ new 关键字一起工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多