• ベストアンサー

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[]で破棄しても問題ないか? という意味の質問です。 コンパイルして実行しても特にエラーを吐くことはありませんでしたが非常に心配です。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

規格という面では未定義動作なのでアウト. 現実的には, new[] が「生成したオブジェクトの個数」をどこかにこっそり記録しておき, その情報を使って delete[] がデストラクタを必要な回数だけ呼び出すという実装が考えられます. new では「生成したオブジェクトの個数」が記録されていない可能性があり, そのために delete[] が誤動作する可能性があります.

sirn
質問者

お礼

newをdelete[]で消すのは、未定義動作なんですか。 う~ん............ 仮に一つしか領域を確保しないのであればnewではなくnew 型[1]と書いてやればdelete[]でも大丈夫ということでしょうか?

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

規格にいわく ・new で確保したら delete ・new[] で確保したら delete[] ということで.

回答No.3

> new 型[1]と書いてやればdelete[]でも大丈夫ということでしょうか? "delete[]でも大丈夫"じゃなくて、 "delete[]でなくてはならない"です。

  • scnut
  • ベストアンサー率33% (1/3)
回答No.2

int* p = new int[1]; delete[] p; なら正しいです。 int* p = new int(0); は int* p = new int; *p = 0; なのでdeleteについて考えるなら(0)を付けない方がすっきりします。

関連するQ&A