当没有抛出bad_alloc时,对于'new`保证无法保证是什么意思

时间:2013-07-31 12:55:18

标签: c++ std

来自new的{​​{3}}:

  

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

对我而言,这应该意味着这段代码

#include <new>

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

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

非常好。但是,在使用gcc进行编译时(请参阅documentation),程序会在抛出int后终止。

3 个答案:

答案 0 :(得分:11)

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

new expressionoperator new进行比较。

答案 1 :(得分:4)

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

  1. 致电operator new以获取存储空间。
  2. 调用A的构造函数在该存储中创建A对象。
  3. 您粘贴的引语仅描述函数::operator new(std::size_t)的行为。在int已经成功并退出后,第2步抛出operator new

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

答案 2 :(得分:2)

关键字new是无法保证的,而不是您要分配的类(A)。您已明确将A的构造函数定义为抛出异常;分配A时,A会引发异常,而不是new