以下代码是否安全?
Foo& GetFoo()
{
static std::once_flag fooInitFlag;
static Foo f;
std::call_once(fooInitFlag, [&Foo]()
{
Foo.Init();
});
return std::ref(f);
}
答案 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;
}