オブジェクトを割り当てて配列しました
Objects *array = new Objects[N];
この配列を削除するにはどうすればよいですか?ただ
delete[] array;
または配列の要素を繰り返し処理しますか?
for(int i=0;i<N;i++)
delete array[i];
delete[];
ありがとう
更新:
ループ本体を次のように変更しました
delete &array[i];
コードを強制的にコンパイルします。
new
の使用はすべてdelete
でバランスをとる必要があり、new[]
の使用はすべてdelete[]
でバランスをとる必要があります。
for(int i=0;i<N;i++)
delete array[i];
delete[] array;
これは、配列を次のように初期化した場合にのみ適切です。
Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) {
array[i] = new Object;
}
元のコードがコンパイルエラーを提供したという事実は、何か間違ったことをしているという強力なヒントです。
ところで、必須:new[]
で配列を割り当てることは避けてください。代わりにstd::vector
を使用すると、デストラクタがクリーンアップを処理します。さらに、例外がスローされた場合にメモリをリークしないため、例外に対して安全です。
delete[] array
で十分です。 delete[]
演算子を使用して配列を削除すると、配列の各要素が削除されることが保証されます。
一般的なルールとして、delete
/delete[]
new
/new[]
で割り当てたものとまったく同じにする必要があります。この場合、new[]
の割り当てが1つあるため、delete[]
の呼び出しを1回使用して、割り当てられたものを再び解放する必要があります。
Forループのdelete
sがコンパイルされないことも、それらが正しい方法ではないことを示す良い兆候です。
だけでなく
delete [] array;
十分ですが、もしそうなら
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
あなたは未定義の動作を引き起こすでしょう、なぜなら
delete &array[i];
new
操作によって返されなかったものを削除します。
言うまでもなく、後続のdelete[] array;
は、ループでデストラクタが呼び出されたばかりのすべてのオブジェクトのデストラクタを呼び出します。
だからそれをしないでください。
delete [] array
十分です.