2009-12-09 65 views
10

假定以下代码:将使用从构造函数中抛出的新(std :: nothrow)掩码异常吗?

Foo* p = new (std::nothrow) Foo(); 

“P”将等于0,如果我们出堆内存。

如果我们是不是会发生什么情况但Foo的构造函数会抛出?这个异常是否会被'new'和'p'的nothrow版本设置为0所“掩盖”......或者,从Foo的构造函数抛出的异常是否会使其不在函数中?

回答

16

不,它不会。 nothrow仅适用于对new的调用,而不适用于构造函数。

12

Foo的构造函数仍然可以抛出异常,它们将会通过。

构造函数直到分配内存后才被调用。

6

我刚试过。例外通过。如果您运行下面的代码:

#include <new> 

class Foo 
{ 
public: 
    Foo() 
    { 
     throw 42; 
    } 
}; 


int main() 
{ 
    Foo* foo = new(std::nothrow) Foo; 

    return 0; 
} 

,那么你得到下面的输出(在Linux反正):

terminate called after throwing an instance of 'int' 
Aborted 

因此,除了确实尽管抛出异常的打通。

相关问题