是否会使用从构造函数抛出的新(std :: nothrow)掩码异常?

时间:2009-12-09 23:39:49

标签: c++ new-operator

假设以下代码:

Foo* p = new (std::nothrow) Foo();
如果我们没有堆内存,

'p'将等于0。

如果我们 NOT 内存不足但Foo的构造函数抛出会发生什么?将'new'和'p'设置为0的nothrow版本会“掩盖”该异常吗?...或者Foo的构造函数抛出的异常是否会使其脱离函数?

3 个答案:

答案 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

所以,尽管没有这种例外,这个例外确实可以通过。