p的价值是什么?Foo * p = new Foo()'如果Foo的构造函数抛出?

时间:2014-09-26 06:20:15

标签: c++ exception

我不确定如何对这个问题发表评论,以便谷歌可以帮助我。

今天早些时候一位同事问我(换句话说):

给出以下代码:

struct Foo
{
    Foo() {throw 1;}
}

Foo* bar()
{
    Foo *p = NULL;
    try
    {
        p = new Foo();
    }
    catch (...) {}

    return p;
}

根据C ++标准,bar()保证返回NULL,还是行为实现定义?我猜它是后者,从我读过的关于在C ++中被破解的双重检查锁定习语的文章。

1 个答案:

答案 0 :(得分:4)

如果构造函数抛出,则不会发生赋值,因此p具有之前的任何值。

是的,bar保证在您的代码段中返回NULL

这与双重检查锁定无关;这是一个无关的并发问题。