266

簡単なテストアプリ:

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

出力:

0x876c0b8

だからそれはうまくいくように見えます。これについて標準は何と言っていますか?メモリの空のブロックを「割り当てる」ことは常に合法ですか?

4

6 に答える 6

249

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 とは異なります。]

于 2009-07-06T13:46:29.263 に答える
24

はい、このようにサイズがゼロの配列を割り当てることは合法です。ただし、それも削除する必要があります。

于 2009-07-06T13:45:23.447 に答える
15

これについて標準は何と言っていますか?メモリの空のブロックを「割り当てる」ことは常に合法ですか?

すべてのオブジェクトには一意の ID、つまり一意のアドレスがあり、これは長さが 0 でないことを意味します (0 バイトを要求すると、メモリの実際の量は静かに増加します)。

これらのオブジェクトを複数割り当てた場合、それらのアドレスが異なることがわかります。

于 2009-07-06T13:49:34.877 に答える
14

0はい、サイズのブロックを で割り当てることは完全に合法newです。アクセスできる有効なデータがないため、何も役に立たないだけです。int[0] = 5;違法です。

ただし、標準ではmalloc(0)return などを許可していると思いますNULL

delete []割り当てから返されたポインタも必要です。

于 2009-07-06T13:47:43.537 に答える