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

tjd*_*tjd 10 c++ new-operator

假设以下代码:

Foo* p = new (std::nothrow) Foo();
Run Code Online (Sandbox Code Playgroud)

如果我们没有堆内存,'p'将等于0.

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

小智 16

不,它不会.将nothrow仅适用于呼叫new,而不是构造函数.


Bri*_*ndy 12

Foo的构造函数仍然可以抛出异常,它们将会崩溃.

在分配内存之后才会调用构造函数.


Jon*_*vis 6

我刚尝试过.例外确实可以通过.如果您运行以下代码:

#include <new>

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


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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后你得到以下输出(无论如何在Linux上):

terminate called after throwing an instance of 'int'
Aborted
Run Code Online (Sandbox Code Playgroud)

因此,尽管没有提及,但这个例外确实得到了解决.