私が C++ を教えられたとき、これはずっと前のことでした。絶対に使用しないように言われましたdelete
が、単一のオブジェクトでdelete[]
実行すると. 先生を信用しすぎてはいけないと思うのですが、これは本当ですか?delete[]
delete
delete
の代わりに電話する理由はありdelete[]
ますか?
SOで関連する可能性のある質問をスキャンしましたが、明確な答えが見つかりませんでした。
私が C++ を教えられたとき、これはずっと前のことでした。絶対に使用しないように言われましたdelete
が、単一のオブジェクトでdelete[]
実行すると. 先生を信用しすぎてはいけないと思うのですが、これは本当ですか?delete[]
delete
delete
の代わりに電話する理由はありdelete[]
ますか?
SOで関連する可能性のある質問をスキャンしましたが、明確な答えが見つかりませんでした。
標準 (5.3.5/2) から:
最初の選択肢 (オブジェクトの削除) では、削除のオペランドの値は、非配列オブジェクトへのポインター、またはそのようなオブジェクトの基底クラスを表すサブオブジェクト (1.8) へのポインターでなければなりません (10 節)。 そうでない場合、動作は未定義です。
2 番目の選択肢 (delete array) では、delete のオペランドの値は、前の配列 new 式から得られたポインター値でなければなりません。そうでない場合、動作は未定義です。
だからいいえ:それらは決して同等ではありません!
delete []
は「ベクター削除」であり、ベクター新規、つまり に対応しnew[]
ます。
一致するアロケータのペアを使用する必要があります。たとえば、、、、malloc/free
そうしないと、未定義の動作が発生しますnew/delete
。new[]/delete[]
いいえ!delete[]
で割り当てる場合は を呼び出しnew[]
、それ以外の場合は を呼び出しますdelete
。
先生があなたに言ったことは未定義の動作につながり、運が良ければアプリケーションがクラッシュします。
delete
は単一のオブジェクトを削除するためにdelete[]
使用され、 はオブジェクトの配列を削除するために使用されます。詳細については、このリンクを確認してください。