C++11 では、グローバル演算子 new を使用して負のサイズの配列を割り当てようとすると、std::bad_array_new_length がスローされますが、C++98 / C++03 ではどうですか? UB ですか、それとも std::bad_alloc をスローしますか?
int main()
{
int* ptr = new int[-1];
}
C++11 では、グローバル演算子 new を使用して負のサイズの配列を割り当てようとすると、std::bad_array_new_length がスローされますが、C++98 / C++03 ではどうですか? UB ですか、それとも std::bad_alloc をスローしますか?
int main()
{
int* ptr = new int[-1];
}
サイズが C++03 標準の負の 5.3.4p6 である場合、プログラムは正しくありません。
direct-new-declarator 内のすべての定数式は整数定数式 (5.19) であり、厳密に正の値に評価されます。direct-new-declarator の式は、負でない値を持つ整数型または列挙型 (3.9.1) を持つ必要があります。
上記の引用は をカバーしていますnew T[a][b];
。ここb
で、は文法による定数式a
であり、 は式(最初の次元のみ) です。
new []の定義は、にtypedefされた符号なし整数が必要であることを示していsize_t
ます。だからそれは決してコンパイルされるべきではありません。
ここhttp://en.cppreference.com/w/cpp/types/size_t(unsigned int)を参照してください。
あなたはこれを得る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