0

より大きなプログラムでのメモリの問題を理解しようとするために書かれた多精度ライブラリ MPFR を使用する単純な C++ プログラムがあります。

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

Process Explorerは、タスク マネージャーよりもプロセスのメモリ使用量 (仮想サイズ) をより現実的に表示します。メモリリークは、プログラムがメモリを解放しない場合に発生する必要があり、これが常に発生すると、メモリの増加が止まることはありません。

Windows は、必ずしもプログラムのメモリを解放してシステム自体に戻すわけではありません。そのため、タスク マネージャーなどはすべての真実を教えてくれません。

この MSDN ページで説明されているように、Visual Studio でメモリ リークを検出するには、_CRTDBG_MAP_ALLOCマクロを有効にします。

また、この質問newでは、C++キーワードで動作させることについて少し話しています。

于 2013-11-19T12:55:38.347 に答える