1. ホーム
  2. c++

[解決済み】C++ new int[0] -- メモリは確保されるのか?

2022-04-20 12:53:19

質問

簡単なテストアプリです。

cout << new int[0] << endl;

を出力します。

0x876c0b8

ということで、うまくいったようです。標準ではどうなっているのでしょうか?空のメモリブロックを割り当てることは常に合法なのでしょうか?

どのように解決するのですか?

5.3.4/7から

direct-new-declaratorの式の値が0のとき、アロケーション関数が呼ばれ、要素のない配列がアロケートされます。

3.7.3.1より

ゼロサイズの要求として返されたポインタをデリファレンスした場合の効果は未定義です。

また

newが)要求した領域のサイズがゼロであっても、要求が失敗することがあります。

つまり、それは可能ですが、合法的に(すべてのプラットフォームできちんと定義された方法で)取得したメモリを再参照することはできません - 配列削除にのみ渡すことができます - そしてそれを削除する必要があります。

3.7.3.1/2の文章には、興味深い脚注(つまり、規格の規範的な部分ではなく、説明のために含まれている)が付いています。

<ブロッククオート

[32. malloc()またはcalloc()を呼び出すことによってoperator new()を実装できるようにすることが意図されているので、実質的にルールは同じです。C++は、ゼロ要求が非ヌルポインタを返すことを要求する点でCと異なる]。