- ベストアンサー
newで生成したものをdelete[]で破棄するのは間違い?
int* p = new int(0); と確保したものを、普通は delete p; と書いて破棄しますが、代わりに delete[] p; と書いて破棄しても問題はないのでしょうか? 非常に悪いコードなのですが..... <1>: int* p = new int(0); <2>: int* p = new int[x]; //xはどこかで値を設定済み このうちの、1か2かのどちらかでpに対して領域を割り付けた場合に、どちらもdelete[]で破棄しても問題ないか? という意味の質問です。 コンパイルして実行しても特にエラーを吐くことはありませんでしたが非常に心配です。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
規格という面では未定義動作なのでアウト. 現実的には, new[] が「生成したオブジェクトの個数」をどこかにこっそり記録しておき, その情報を使って delete[] がデストラクタを必要な回数だけ呼び出すという実装が考えられます. new では「生成したオブジェクトの個数」が記録されていない可能性があり, そのために delete[] が誤動作する可能性があります.
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
規格にいわく ・new で確保したら delete ・new[] で確保したら delete[] ということで.
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
> new 型[1]と書いてやればdelete[]でも大丈夫ということでしょうか? "delete[]でも大丈夫"じゃなくて、 "delete[]でなくてはならない"です。
- scnut
- ベストアンサー率33% (1/3)
int* p = new int[1]; delete[] p; なら正しいです。 int* p = new int(0); は int* p = new int; *p = 0; なのでdeleteについて考えるなら(0)を付けない方がすっきりします。
お礼
newをdelete[]で消すのは、未定義動作なんですか。 う~ん............ 仮に一つしか領域を確保しないのであればnewではなくnew 型[1]と書いてやればdelete[]でも大丈夫ということでしょうか?