簡単なテストアプリ:
cout << new int[0] << endl;
出力:
0x876c0b8
だからそれはうまくいくように見えます。これについて標準は何と言っていますか?メモリの空のブロックを「割り当てる」ことは常に合法ですか?
簡単なテストアプリ:
cout << new int[0] << endl;
出力:
0x876c0b8
だからそれはうまくいくように見えます。これについて標準は何と言っていますか?メモリの空のブロックを「割り当てる」ことは常に合法ですか?
5.3.4/7から
direct-new-declarator の式の値が 0 の場合、要素のない配列を割り当てるために割り当て関数が呼び出されます。
3.7.3.1/2から
サイズ 0 の要求として返されたポインターを逆参照した場合の影響は未定義です。
また
[新規によって] 要求されたスペースのサイズがゼロであっても、要求は失敗する可能性があります。
つまり、それは可能ですが、取得したメモリを合法的に (すべてのプラットフォームで明確に定義された方法で) 逆参照することはできません。配列の削除にのみ渡すことができ、削除する必要があります。
以下は、3.7.3.1/2 の文に付けられた興味深い脚注です (つまり、標準の規範的な部分ではありませんが、説明目的で含まれています)。
[32。その意図は、malloc() または calloc() を呼び出すことによってオペレーター new() を実装できるようにすることなので、ルールは実質的に同じです。C++ は、null 以外のポインターを返すためにゼロ要求を必要とする点で C とは異なります。]
はい、このようにサイズがゼロの配列を割り当てることは合法です。ただし、それも削除する必要があります。
これについて標準は何と言っていますか?メモリの空のブロックを「割り当てる」ことは常に合法ですか?
すべてのオブジェクトには一意の ID、つまり一意のアドレスがあり、これは長さが 0 でないことを意味します (0 バイトを要求すると、メモリの実際の量は静かに増加します)。
これらのオブジェクトを複数割り当てた場合、それらのアドレスが異なることがわかります。
0
はい、サイズのブロックを で割り当てることは完全に合法new
です。アクセスできる有効なデータがないため、何も役に立たないだけです。int[0] = 5;
違法です。
ただし、標準ではmalloc(0)
return などを許可していると思いますNULL
。
delete []
割り当てから返されたポインタも必要です。