35

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

Objects *array = new Objects[N];

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

delete[] array;

または、配列の要素を反復処理しますか?

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

ありがとう

アップデート:

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

delete &array[i];

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

4

5 に答える 5

53

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

于 2010-03-21T05:26:00.457 に答える
18

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

于 2010-03-21T05:19:37.197 に答える
13

原則として、あなたはdelete/あなたが/delete[]で割り当てたものを正確にすべきです。この場合、で割り当てが1つあるため、1回の呼び出しを使用して、割り当てられたものを再度解放する必要があります。newnew[]new[]delete[]

forループ内のdeletesがコンパイルされないということは、それらが正しくコンパイルされていないことを示す良い兆候でもあります。

于 2010-03-21T05:23:17.460 に答える
9

だけでなく

delete [] array;

十分ですが、

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

未定義の動作が発生するため、

delete &array[i];

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

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

だからそうしないでください。

于 2010-03-21T05:25:50.223 に答える
8
delete [] array

十分です。

于 2010-03-21T05:19:35.280 に答える