より大きなプログラムでのメモリの問題を理解しようとするために書かれた多精度ライブラリ 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 にそれぞれ必要なメモリ値の合計のように増加します。より大きなサイズでも同様の動作が見られます。
何が起こっているのか分かりますか?