web-dev-qa-db-ja.com

delete []オブジェクトの配列

オブジェクトを割り当てて配列しました

Objects *array = new Objects[N];

この配列を削除するにはどうすればよいですか?ただ

delete[] array;

または配列の要素を繰り返し処理しますか?

for(int i=0;i<N;i++)
    delete array[i];
delete[];

ありがとう

更新:

ループ本体を次のように変更しました

delete &array[i];

コードを強制的にコンパイルします。

31
osgx

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を使用すると、デストラクタがクリーンアップを処理します。さらに、例外がスローされた場合にメモリをリークしないため、例外に対して安全です。

43
jamesdlin

delete[] arrayで十分です。 delete[]演算子を使用して配列を削除すると、配列の各要素が削除されることが保証されます。

14
Naveen

一般的なルールとして、delete/delete[]new/new[]で割り当てたものとまったく同じにする必要があります。この場合、new[]の割り当てが1つあるため、delete[]の呼び出しを1回使用して、割り当てられたものを再び解放する必要があります。

Forループのdeletesがコンパイルされないことも、それらが正しい方法ではないことを示す良い兆候です。

13
sth

だけでなく

delete [] array;

十分ですが、もしそうなら

for(int i=0;i<N;i++)
    delete &array[i];
delete[] array;

あなたは未定義の動作を引き起こすでしょう、なぜなら

delete &array[i];

new操作によって返されなかったものを削除します。

言うまでもなく、後続のdelete[] array;は、ループでデストラクタが呼び出されたばかりのすべてのオブジェクトのデストラクタを呼び出します。

だからそれをしないでください。

8
Michael Burr
delete [] array

十分です.

7
vava