调用另一个翻译单元的函数会导致静态初始化顺序失败
Calling a function of another translation unit can cause static initialization order fiasco
a.cpp
static Foo fooobj;
void Usefoo()
{
foooobj.somefunc();
}
b.cpp
static Bar barobj;
这里是Bar
的构造函数
Bar::Bar()
{
Usefoo();
}
这会导致静态初始化顺序失败吗?
如果是,我该如何解决。我想到了如下内容:
Foo* GetFoo*()
{
static Foo *fooobj = new Foo();
return fooobj;
}
但由于我不支持 C++11,静态本地初始化不是线程安全的。
因此这行不通。
另外,如果 barobj
是非静态的。那我就不用担心这次惨败了对吧?对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化不是问题。对吗?
Will this lead to static initialization order fiasco?
是的。
I thought of something like below:
通常你会避开指针并做一个好的:
Foo& GetFoo()
{
static Foo fooobj;
return fooobj;
}
But since I don't have support of C++11, static local initialization is not thread safe.
好吧,那还是有问题。
Also what if barobj was non-static. Then I don't have to worry about this fiasco right?
没错。您应该避免使用这些全局变量。事实上,这是一个很好的例子,说明了我们为什么要避免使用全局变量。
将您的状态封装到一个漂亮的 class 中,也许在 main
中实例化并根据需要传递。
For a non-static object initialization which is depending on another non-static object initialization in a different translation unit is not an issue. Right?
没错。除非你的程序有未定义的行为,否则我想不出打破它的方法。
a.cpp
static Foo fooobj;
void Usefoo()
{
foooobj.somefunc();
}
b.cpp
static Bar barobj;
这里是Bar
Bar::Bar()
{
Usefoo();
}
这会导致静态初始化顺序失败吗? 如果是,我该如何解决。我想到了如下内容:
Foo* GetFoo*()
{
static Foo *fooobj = new Foo();
return fooobj;
}
但由于我不支持 C++11,静态本地初始化不是线程安全的。 因此这行不通。
另外,如果 barobj
是非静态的。那我就不用担心这次惨败了对吧?对于依赖于不同翻译单元中的另一个非静态对象初始化的非静态对象初始化不是问题。对吗?
Will this lead to static initialization order fiasco?
是的。
I thought of something like below:
通常你会避开指针并做一个好的:
Foo& GetFoo()
{
static Foo fooobj;
return fooobj;
}
But since I don't have support of C++11, static local initialization is not thread safe.
好吧,那还是有问题。
Also what if barobj was non-static. Then I don't have to worry about this fiasco right?
没错。您应该避免使用这些全局变量。事实上,这是一个很好的例子,说明了我们为什么要避免使用全局变量。
将您的状态封装到一个漂亮的 class 中,也许在 main
中实例化并根据需要传递。
For a non-static object initialization which is depending on another non-static object initialization in a different translation unit is not an issue. Right?
没错。除非你的程序有未定义的行为,否则我想不出打破它的方法。