利用規約の変更について

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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

規格という面では未定義動作なのでアウト.


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

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

お礼日時:2008/05/24 01:33

規格にいわく


・new で確保したら delete
・new[] で確保したら delete[]
ということで.
    • good
    • 0

> new 型[1]と書いてやればdelete[]でも大丈夫ということでしょうか?



"delete[]でも大丈夫"じゃなくて、
"delete[]でなくてはならない"です。
    • good
    • 0

int* p = new int[1];


delete[] p;
なら正しいです。

int* p = new int(0);

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング