C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■95394 / 1階層)  C++ サイズ0でnewした場合
□投稿者/ 774RR (813回)-(2020/07/28(Tue) 15:30:01)
サイズ0ってのは int* p=new int[0]; の意味? (new int で 0 バイトを取ることはできないので)

JIS X 3014:2003 5.3.4 new 式の 7
直接 new 宣言子の中の式の値がゼロの場合、割付関数が呼び出され、要素のない配列が割り付けられる。
と規定されているため、規格合致処理系であれば
・要素数0のメモリが確保される(管理用オーバーヘッドを含めると0バイトより大きい)
・プログラマは返された領域を使ってはならない
・ delete[] するまでメモリは使用済みであって再利用されない
ってことっス。
# 同 6 には非負とあるので、負数を渡すのは違反

この辺は C の malloc(0) の挙動にも似ていて JIS X 3010:2003 7.20.3
・0バイトのオブジェクトを割り当ててその先頭へのポインタを返した場合には
・プログラマは返された領域を使ってはならない
・返された領域に対して realloc を使ってよい
・返された領域に対して free を使ってよい( free するまで再利用されない)
・返された領域は管理領域を含めると0バイトより大きい

ってことで delete[] しないとメモリリークするですよ。

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←C++ サイズ0でnewした場合 /az →Re[2]: C++ サイズ0でnewした場合 /az
 
上記関連ツリー

C++ サイズ0でnewした場合 / az (20/07/28(Tue) 14:06) #95391
C++ サイズ0でnewした場合 / 774RR (20/07/28(Tue) 15:30) #95394 ←Now
  └ Re[2]: C++ サイズ0でnewした場合 / az (20/07/28(Tue) 16:19) #95398
    └ Re[3]: C++ サイズ0でnewした場合 / 774RR (20/07/28(Tue) 16:33) #95399
      └ Re[4]: C++ サイズ0でnewした場合 / az (20/07/29(Wed) 11:47) #95409
        └ Re[5]: C++ サイズ0でnewした場合 / 774RR (20/07/29(Wed) 13:11) #95410
          └ Re[6]: C++ サイズ0でnewした場合 / 774RR (20/07/29(Wed) 15:41) #95414

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信