2015-11-17 4 views
7

Iが状態(強調鉱山)(5.3.7ページ110条)ドラフト標準N3337と脚注79を読んでいた:非ゼロ長の配列についてドラフト標準で言及されている長さゼロ配列は何ですか?

79)、これは同じですそのnew-expressionによって作成された配列の最初の要素 へのポインタ。 ゼロ長 配列が最初の要素に

を持っていない私は、C++は長さゼロの配列をサポートしていませんでしたという印象の下にありました。

+1

あなたはそれらをあまり使うことができません。基本的には、私が知る限り、mallocの観点からnewを実装することができます。 –

答えて

4

私が知る限り、これは、ゼロサイズのリクエストを可能にするmallocの観点からnewを実装することを可能にすることです。そのようなポインタを逆参照する場合は、以下の引用符に記載されているとおり、未定義の動作であるため、あまり多くのことを行うことはできません。

私たちは、セクション3.7.4.1[basic.stc.dynamic.allocation]から参照されているドラフトC++標準の脚注35に根拠を見つけることができます。[...]でもの大きさならば

要求されたスペースがゼロの場合、要求は失敗する可能性があります。 要求が成功した場合、返される値は、その値p1が後で演算子の削除に渡されない限り、以前に返された値p1の とは異なる非nullポインタ値(4.10)p0になります。ゼロサイズの要求として返されたポインタを参照解除すると、 の効果は不定になります。

意図がのstd ::のmalloc()またはSTD ::はcalloc()を呼び出すことで実装可能)(new演算子を持っているので、ルールは以下のとおりです。

および脚注35氏は述べています実質的には と同じです。 C++は、ゼロ以外のポインタを返す要求がゼロである点でCと異なります。標準セクション7.22.3メモリ管理機能C11のドラフトから

[...] のサイズ要求スペースがゼロである、動作は実装定義されている場合:いずれかのヌルポインタ が返さ、またはサイズが 返されたポインタを使用してはならないことを除いて、いくつかの非ゼロ値であるかのように挙動がですオブジェクトにアクセスする。

6

int arr[0]; 

のような長さゼロの配列は、標準C++ではありませんが、

int *arr = new int[0]; 

のような長さゼロの動的な配列は、法的であり、あなたの引用があまりにも言及しているものです。

noptr-new-declaratorの式の値が0の場合、割り当て関数は 要素のない配列を割り当てます。

5.3.4(7)in N3337。

関連する問題