new演算子で質問

[戻る]
SunPac 2003/10/23(木) 11:49:14
基本的な事なのですが、ちょっと気になりましたので質問します。

    int *pNum = NULL;
    pNum = new int[0];

といった記述はOKなのでしょうか?
一応何かしらのアドレスがpNumに入っているようですが・・・
あと、このケースもちゃんとdeleteしないといけないのでしょうか?
例えばある関数でサイズを引数に取り、関数内でそのサイズのメモリ確保するような
場合、関数に0を渡した処理をしなければならないのか(まあ普通するでしょうが)
気になっています。
環境はVC6++とWinXPです。
ついでにmalloc()の場合も知りたいです。
基本的な事ですがよろしくお願いします。

επιστημη [E-Mail] [HomePage] 2003/10/23(木) 11:57:29
non-zeroな値が返ってきたなら、deleteしなければなりません。
malloc/freeも同様。

SunPac 2003/10/23(木) 12:53:02
[[解決]]
早速のお答えありがとうございます。
某雑誌(某の意味ないかも)先月号で、NULLをfreeしてもOKとの事なので、
結局はnew(malloc())の戻り値は常にdelete(free())して問題ないわけですね。

euro2004 2003/10/23(木) 12:57:28
>結局はnew(malloc())の戻り値は常にdelete(free())して問題ないわけですね。

蛇足かも知れませんが、2重free/deleteには注意してください。

SunPac 2003/10/23(木) 13:01:43
ご忠告ありがとうございます。
私は、delete(free)したあとは必ずポインタをNULLにしてますので
例え二重delete(free)しても問題ないはずなので気にしてません!!

・・・うそです。ちゃんとその辺には気を使っております、はい。

tetrapod 2003/10/23(木) 13:14:03
補足。
new 式に渡してよい「個数」の式は非負でなければなりません。
つまり0は許されています (IS 5.3.4 new の 6, 7 項)
その際には0個の配列が確保され(コンストラクタは起動されない)
他のオブジェクトとアドレスが重複しない非0ポインタが返されます。

new に失敗すると std::bad_alloc 例外が投げられるので、
ふつー、new 式の結果として0が得られることはありません。
また delete 0 は何も起こらないことになっています。

malloc(0) が 0 を返すか、0バイト使用可能なヒープ領域への
ポインタを返すかは処理系定義です。
free(0) は「バグっていない処理系」なら何も起こらないことが
保証されています。 (VC6 は大丈夫)

ということで、個数なりバイト数なりが0であっても
new の結果は無条件で delete に渡してよく
malloc の結果は無条件で free に渡してよい
のです。
(渡されたポインタの先をアクセスしてよいかどうかは別問題)

SunPac 2003/10/23(木) 13:42:10
親切かつ丁寧な説明ありがとうございます。
おかげでよく分かりました。
malloc()がNULLを返すのはメモリが足りなかった場合のみだと思っておりましたが、
処理系によってはmalloc(0)でもNULLを返す事があるのですね。
初めて知りました。

古いスレッドには追加発言できません。