6

C++11 では、グローバル演算子 new を使用して負のサイズの配列を割り当てようとすると、std::bad_array_new_length がスローされますが、C++98 / C++03 ではどうですか? UB ですか、それとも std::bad_alloc をスローしますか?

int main()
{
   int* ptr = new int[-1];
}
4

3 に答える 3

7

サイズが C++03 標準の負の 5.3.4p6 である場合、プログラムは正しくありません。

direct-new-declarator 内のすべての定数式は整数定数式 (5.19) であり、厳密に正の値に評価されます。direct-new-declarator の式は、負でない値を持つ整数型または列挙型 (3.9.1) を持つ必要があります。

上記の引用は をカバーしていますnew T[a][b];。ここbで、は文法による定数式aであり、 は(最初の次元のみ) です。

于 2012-10-23T20:47:15.537 に答える
2

new []の定義は、にtypedefされた符号なし整数が必要であることを示していsize_tます。だからそれは決してコンパイルされるべきではありません。

ここhttp://en.cppreference.com/w/cpp/types/size_t(unsigned int)を参照してください。

于 2012-10-23T20:41:02.467 に答える
2

あなたはこれを得るint a[-1]

prog.cpp: In function ‘int main()’:
prog.cpp:4: error: size of array ‘b’ is negative

そしてこれはint* a = new int[-1](実行時エラー):

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
于 2012-10-23T20:39:13.300 に答える