#include <iostream>
#include <new>
int main()
{
int n = -1;
try
{
int *p = new(std::nothrow) int[n];
if(!p)
std::cout << "new expression returned nullptr\n";
}
catch(const std::bad_array_new_length& e)
{
std::cout << "new expression threw " << e.what() << std::endl;
}
}
为什么此代码会引发异常?打印new expression threw std::bad_array_new_length
。根据标准,在这种情况下,新表达式应返回nullptr。
如果存在noptr-new-declarator中的表达式,则为隐式转换为std :: size_t。如果出现以下情况,则该表达式是错误的:
-表达式为非类类型,其值转换为std :: size_t小于零;
[...]
如果表达式错误转换为std :: size_t:
后—如果表达式是核心常量表达式,程序格式不正确;
-否则,分配函数不被调用;代替
-如果分配本应调用的函数具有非抛出异常规范(14.5),new-expression的值为null所需结果类型的指针值;
-否则,new-expression通过引发以下类型的异常终止将匹配类型为std :: bad_array_new_length的处理程序(14.4)(17.6.3.2)。
与gcc 9.2一起编译
我怀疑这是libstdc ++中的错误;使用clang和libc ++运行此代码将显示“新表达式返回了nullptr”