2009-08-11 7 views
5

いくつかのコード例を見ると、ゼロサイズの配列割り当てがあります。ゼロサイズの配列割り当ては何を意味するのですか?

class T 
{ 
}; 

int main(void) 
{ 
    T * ptr = new T[0]; 

    return 0; 
} 

その使用はどのようなものです:私は私の質問

これは有効なコードを明確にするために、次のコードスニペットを作成しましたか? ptrは有効ですか?この構造は移植可能ですか?

答えて

8

5.3.4:

6すべて定数式直接新しい-宣言子では整数定数式(5.19)であることと厳密に正の値に評価するものとします。が負の値で整数または列挙タイプ(3.9.1)を持たなければならない直接新しい-宣言子で表現 ...

7場合は、直接表現の値-new-declaratorが0の場合、配列なしの配列を割り当てるためにallocation関数が呼び出されます。

あなたのコードは、他の配列のようにあらゆる点で動作する配列を割り当てます(delete []で削除でき、パラメータとして渡されます、おそらく他のもの)。ただし、アクセス可能な索引はありません(つまり、ptr [0]の読取りまたは書込みは未定義の動作になります)。

この場合、定数式と式の違いは、実際の式がコンパイル時定数(明らかに0です)であるかどうかではなく、多次元配列の「最後の」次元を指定するかどうかではありません。構文は5.3.4:1で定義されています。

0

はい有効な動作であり、ptrは有効です。この構造体は、C++標準に準拠するすべてのC++コンパイラに移植可能です。これは、要素の数がゼロの場合を処理するために特別なケースを必要としないコードを書くことができるので便利です。

しかし、常にそうであるように、配列の代わりにstd :: vector(ゼロサイズにすることもできます)を使用する方が良いでしょう。

2

許可されています(5.3.4/6)。その結果は空の配列なので、返される値は配列の前のポインタです。

0

関連する問題は、

のcalloc、malloc関数かどうか、および reallocの機能ヌル ポインタまたは返す:What should malloc(0) return?

And from some C99 docs、malloc関数は、(0)の動作は実装定義であります要求されたサイズがゼロのときに割り当てられた オブジェクトへのポインタ (7.20.3)。

nullポインタまたはfree() に渡すことができる一意の ポインタが返されます。

malloc(3C)のマニュアルページを参照してください。

あなたはC++について質問していますが、とにかくmalloc情報はおそらく役に立ちます。 C++標準で

+1

C++ newはよく定義されています。 – AProgrammer

関連する問題