new演算子で質問 – プログラミング – Home

通知
すべてクリア

[解決済] new演算子で質問


SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

基本的な事なのですが、ちょっと気になりましたので質問します。

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

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


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

non-zeroな値が返ってきたなら、deleteしなければなりません。
malloc/freeも同様。


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

早速のお答えありがとうございます。
某雑誌(某の意味ないかも)先月号で、NULLをfreeしてもOKとの事なので、
結局はnew(malloc())の戻り値は常にdelete(free())して問題ないわけですね。


返信引用
euro2004
 euro2004
(@euro2004)
ゲスト
結合: 22年前
投稿: 37
 

>結局はnew(malloc())の戻り値は常にdelete(free())して問題ないわけですね。

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


返信引用
SunPac
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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

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


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 22年前
投稿: 830
 

補足。
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
 SunPac
(@SunPac)
ゲスト
結合: 22年前
投稿: 105
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました