@ascheplerはコメントで言及しているように、これはメモリの初期割り当て方法によって異なります。
int*** t = new int**[dim1];
for (int i = 0; i < dim1; i++) {
t[i] = new int*[dim2];
for (int j = 0; j < dim2; j++) {
t[i][j] = new int[dim3];
}
}
あなたは、このようにメモリを割り当てた場合は、メモリはこのようなものになります。:今すぐ
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
| [ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
|
t ---> [ 0 ] [ 1 ]
|
| [ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
+---> [ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
を、あなただけの
を書くと仮定私は、あなたはおそらく、このようにメモリを割り当てられていると仮定します
delete[] t;
あなたがこれを行う場合、メモリは次のようになります。
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
t ---> xxx
[ 0 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 1 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
[ 2 ] --> [ 0 ][ 1 ][ 2 ][ 3 ]
つまり、アレイの1つを再利用しましたが、メモリの大半がリークしました。おっとっと!
一方、forループバージョンの削除コードを使用すると、すべてのポインタを通過して割り当てられた各配列が解放されたため、すべてのメモリが再利用されます。
一般に、すべての割り当てには割り当て解除が必要です。したがって、new[]
を何回か呼び出した場合は、delete[]
を同じ回数呼び出す必要があります。
コメントの中には、int ***
を使用するよりも、おそらく3Dアレイを管理する方が良い方法があることが指摘されています。 C++の一般的な傾向は、オブジェクトを使用してメモリを可能な限り自動的に管理することです。 Boost multi_array
タイプを調べるか、エントリを行優先順に格納するstd::vector
の周りにラッパーを書くことを検討してください。
答えはメモリが最初の場所に配分された方法によって異なります。 – aschepler
トピックオフ: 'int ***'は3D配列ではありません。これは配列の配列の配列になります。これらは本当に悪いキャッシュパフォーマンスを持つことができます。何かを叩いているだけなら、OK。スピードが必要な場合は、1次元配列と3D配列のように見えるラッパーを考えてみましょう。 – user4581301
最初に 'std :: vector'を使わないのはなぜですか? – Jarod42