102

重複の可能性:
(POD)メモリの解放: delete[] は delete と同じですか?

私が C++ を教えられたとき、これはずっと前のことでした。絶対に使用しないように言われましたdeleteが、単一のオブジェクトでdelete[]実行すると. 先生を信用しすぎてはいけないと思うのですが、これは本当ですか?delete[]delete

deleteの代わりに電話する理由はありdelete[]ますか?

SOで関連する可能性のある質問をスキャンしましたが、明確な答えが見つかりませんでした。

4

4 に答える 4

115

標準 (5.3.5/2) から:

最初の選択肢 (オブジェクトの削除) では、削除のオペランドの値は、非配列オブジェクトへのポインター、またはそのようなオブジェクトの基底クラスを表すサブオブジェクト (1.8) へのポインターでなければなりません (10 節)。 そうでない場合、動作は未定義です。

2 番目の選択肢 (delete array) では、delete のオペランドの値は、前の配列 new 式から得られたポインター値でなければなりません。そうでない場合、動作は未定義です。

だからいいえ:それらは決して同等ではありません!

于 2010-11-23T11:38:43.097 に答える
54

delete []は「ベクター削除」であり、ベクター新規、つまり に対応しnew[]ます。

一致するアロケータのペアを使用する必要があります。たとえば、、、、malloc/freeそうしないと、未定義の動作が発生しますnew/deletenew[]/delete[]

于 2010-11-23T11:39:21.490 に答える
36

いいえ!delete[]で割り当てる場合は を呼び出しnew[]、それ以外の場合は を呼び出しますdelete

先生があなたに言ったことは未定義の動作につながり、運が良ければアプリケーションがクラッシュします。

于 2010-11-23T11:38:23.767 に答える
11

deleteは単一のオブジェクトを削除するためにdelete[]使用され、 はオブジェクトの配列を削除するために使用されます。詳細については、このリンクを確認してください。

于 2010-11-23T11:37:05.990 に答える