当bad_alloc没有抛出时,“new”没有抛出保证意味着什么

what does it mean for `new` to be no-throw guaranteed when bad_alloc is not thrown

本文关键字:什么 意味着 new bad alloc      更新时间:2023-10-16

来自new:的文档

第一个版本(1)在分配失败时抛出bad_alloc存储否则,它不会抛出任何异常(没有抛出保证)。

对我来说,这应该意味着这个代码

#include <new>
struct A{
    A(){
        throw 0;
    }  
};
int main(){
    try{
        A* a = new A;
    }
    catch(std::bad_alloc&){}
}

非常好。但是,当使用gcc编译它时(请参见此处),程序在抛出int后终止。

这是operator new的文档,与new表达式不同。new表达式调用operator new以获取内存,然后调用该内存上请求的构造函数。operator new不会抛出除std::bad_alloc之外的任何其他内容,但稍后对构造函数的调用可以抛出用户代码想要的任何内容。

比较newoperator new的表达。

表达式new A通常做两件事:

  1. 致电operator new获取一些存储空间
  2. 调用A的构造函数以在该存储中创建一个A对象

粘贴的引号仅描述函数::operator new(std::size_t)的行为。这里,步骤2在operator new已经成功并退出之后抛出int

(在本例中,C++确实确保在到达任何catch处理程序之前将分配的内存传递给operator delete。)

关键字new不是抛出保护,而不是您正在分配的类(A)。您已经将A的构造函数明确定义为抛出异常;当分配了A时,A抛出异常,而不是new