引用静态函数局部变量

时间:2015-05-21 17:16:13

标签: c++

以下代码是否安全?

Foo& GetFoo()
{
    static std::once_flag fooInitFlag;
    static Foo f;

    std::call_once(fooInitFlag, [&Foo]()
    {
       Foo.Init();
    });

    return std::ref(f);

}

2 个答案:

答案 0 :(得分:3)

而不是这个发布的代码:

Foo& GetFoo()
{
    static std::once_flag fooInitFlag;
    static Foo f;

    std::call_once(fooInitFlag, [&Foo]()
    {
       Foo.Init();
    });

    return std::ref(f);
}

这样做:

struct Initialized_foo
{
    Foo item;
    Initialized_foo() { item.Init(); }
};

auto get_foo()
    -> Foo&
{
    static Initialized_foo the_foo;
    return the_foo.item;
}

它不是更安全,但它更简单,因此可以更安全地防止无意中引入的错误。

请注意,即使在多线程的上下文中,该标准也保证了单个初始化。

更好,理想情况下,Foo构造函数应该正确初始化每个Foo项目,而不是Init方法。但这并不总是可以安排。

答案 1 :(得分:2)

你问:

  

以下代码是否安全?

答案是肯定的。

另一种实施方式:

// Not exposed to the outside.
static Foo& getInitializedFoo();
{
    static Foo f;
    f.Init();
    return f;
}

Foo& GetFoo()
{
    static Foo& f = getInitializedFoo();
    return f;
}