new(std :: nothrow)int [n]引发异常

问题描述 投票:1回答:1
#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一起编译

c++ gcc c++17 new-operator nothrow
1个回答
1
投票

我怀疑这是libstdc ++中的错误;使用clang和libc ++运行此代码将显示“新表达式返回了nullptr”

© www.soinside.com 2019 - 2024. All rights reserved.