在 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
,并且是表达式(仅第一个维度)。
你得到这个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
new[] 的定义指出它需要一个无符号整数,也类型定义为size_t
. 所以那不应该编译。
请参阅此处http://en.cppreference.com/w/cpp/types/size_t(这是一个无符号整数)。