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

你得到这个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 回答
2

new[] 的定义指出它需要一个无符号整数,也类型定义为size_t. 所以那不应该编译。

请参阅此处http://en.cppreference.com/w/cpp/types/size_t(这是一个无符号整数)。

于 2012-10-23T20:41:02.467 回答