1

从以下文档new

如果第一个版本 (1) 未能分配存储,则抛出 bad_alloc。否则,它不会抛出异常(不抛出保证)。

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

#include <new>

struct A{
    A(){
        throw 0;
    }  
};

int main(){
    try{
        A* a = new A;
    }
    catch(std::bad_alloc&){}
}

很好。然而,当用 gcc 编译它时(见这里),程序在抛出一个int.

4

3 回答 3

11

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

new表达式与进行比较operator new

于 2013-07-31T12:57:43.960 回答
4

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

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

您粘贴的报价仅描述了函数的行为::operator new(std::size_t)。这里第 2 步抛出一个intafter operator newhas been succeeded 并退出。

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

于 2013-07-31T13:00:18.490 回答
2

关键字new是 no-throw 保证,而不是您分配的类 ( A)。您已将构造函数显式定义A为抛出异常;A分配an 时,A抛出异常,而不是new.

于 2013-07-31T12:58:27.157 回答