假定以下代码:将使用从构造函数中抛出的新(std :: nothrow)掩码异常吗?
Foo* p = new (std::nothrow) Foo();
“P”将等于0,如果我们出堆内存。
如果我们是不是会发生什么情况但Foo的构造函数会抛出?这个异常是否会被'new'和'p'的nothrow版本设置为0所“掩盖”......或者,从Foo的构造函数抛出的异常是否会使其不在函数中?
假定以下代码:将使用从构造函数中抛出的新(std :: nothrow)掩码异常吗?
Foo* p = new (std::nothrow) Foo();
“P”将等于0,如果我们出堆内存。
如果我们是不是会发生什么情况但Foo的构造函数会抛出?这个异常是否会被'new'和'p'的nothrow版本设置为0所“掩盖”......或者,从Foo的构造函数抛出的异常是否会使其不在函数中?
不,它不会。 nothrow
仅适用于对new
的调用,而不适用于构造函数。
Foo
的构造函数仍然可以抛出异常,它们将会通过。
构造函数直到分配内存后才被调用。
我刚试过。例外通过。如果您运行下面的代码:
#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
因此,除了确实尽管抛出异常的打通。