ジェイソン・コーエンに同意しますが、ループでポインターを削除する必要がある理由については少し明確にすることができます。「新しい」または動的なメモリ割り当てごとに、メモリの割り当て解除を「削除」する必要があります。スマートポインターのように「削除」を非表示にできる場合もありますが、まだそこにあります。
int main()
{
int *pI = new int;
int *pArr = new int[10];
これまでのコードでは、動的メモリの 2 つのチャンクを割り当てました。1 つ目は単なる一般的な int で、2 つ目は int の配列です。
delete pI;
delete [] pArr;
これらの削除ステートメントは、「新しい」によって割り当てられたメモリをクリアします
int ppArr = new int *[10];
for( int indx = 0; indx < 10; ++indx )
{
ppArr[indx] = new int;
}
このコードは、以前の両方の割り当てを行っています。最初に、動的配列に int 用のスペースを作成しています。次に、ループして、配列内の各スポットに int を割り当てる必要があります。
for( int indx = 0; indx < 10; ++indx )
{
delete ppArr[indx];
}
delete [] ppArr;
このメモリを割り当てた順序と、逆の順序で割り当てを解除したことに注意してください。これは、delete [] ppArr; を実行した場合に発生するためです。最初に、他のポインターが何であるかを示す配列を失います。そのチャンクまたはメモリはシステムに戻されるため、確実に読み取ることができなくなります。
int a=0;
int b=1;
int c=2;
ppArr = new int *[3];
ppArr[0] = &a;
ppArr[1] = &b;
ppArr[2] = &c;
これについても言及する必要があると思います。ポインターを操作しているからといって、それらのポインターが指すメモリが動的に割り当てられたわけではありません。つまり、ポインターがあるからといって、必ずしも削除する必要があるわけではありません。ここで作成した配列は動的に割り当てられますが、ポインターは int のローカル インスタンスを指します。これを削除する場合は、配列を削除するだけです。
delete [] ppArr;
return 0;
}
最終的に、動的に割り当てられたメモリは扱いにくい場合がありますが、スマート ポインターのように、または stl コンテナーを使用して安全にラップすることができます。