假设以下代码:
Foo* p = new (std::nothrow) Foo();
如果我们没有堆内存,'p'将等于0。
如果我们 NOT 内存不足但Foo的构造函数抛出会发生什么?将'new'和'p'设置为0的nothrow版本会“掩盖”该异常吗?...或者Foo的构造函数抛出的异常是否会使其脱离函数?
答案 0 :(得分:16)
不,它不会。 nothrow
仅适用于对new
的调用,而不适用于构造函数。
答案 1 :(得分:12)
Foo
的构造函数仍然可以抛出异常,它们将会崩溃。
直到分配内存后才调用构造函数。
答案 2 :(得分: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
所以,尽管没有这种例外,这个例外确实可以通过。