来自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
后终止。
答案 0 :(得分:11)
这是operator new
的文档,与new
表达式不同。 new
表达式调用operator new
以获取内存,然后调用该内存上请求的构造函数。 operator new
除std::bad_alloc
之外不会抛出任何内容,但后来对构造函数的调用可以抛出用户代码所需的任何内容。
将new
expression与operator new
进行比较。
答案 1 :(得分:4)
表达式new A
通常会做两件事:
operator new
以获取存储空间。A
的构造函数在该存储中创建A
对象。您粘贴的引语仅描述函数::operator new(std::size_t)
的行为。在int
已经成功并退出后,第2步抛出operator new
。
(在此示例中,C ++确实确保在到达任何operator delete
处理程序之前将已分配的内存传递给catch
。)
答案 2 :(得分:2)
关键字new
是无法保证的,而不是您要分配的类(A
)。您已明确将A
的构造函数定义为抛出异常;分配A
时,A
会引发异常,而不是new
。