在案件中 在MyClass.h中
class MyClass
{
static vector<type> types;
static vector<type> createTypes();
}
在MyClass.cpp中
vector<type> MyClass::types = createTypes();
MyClass::MyClass()
{
}
什么时候执行createTypes()并且这种初始化静态变量的方法是否涉及任何风险?
答案 0 :(得分:2)
在main()
启动之前,将与其他静态初始化程序一起调用该函数。除了使用其他静态初始化方法之外,您不会冒任何风险。
请记住,所有静态初始化程序都应设计为避免触发SIOF - 静态初始化顺序Fiasco。
同一翻译单元中的静态初始化程序按其在文件中声明的顺序执行。但是,跨多个翻译单元的初始化顺序是不定义。当静态初始化程序依赖于另一个翻译单元时,会出现SIOF。
然后,根据月亮的相位,两个对象都将以正确的顺序初始化并且一切都会起作用,或者它们将以相反的顺序初始化并且您将使用尚未构造的对象 - 未定义行为随之而来。
SIOF-guard模式通过替换如下的静态变量来避免这种情况:
std::list<Foo> gFoos;
...使用包含变量作为本地静态的函数:
std::list<Foo> &gFoos() {
static std::list<Foo> theList;
return theList;
}
这样,变量在函数的第一次调用时始终初始化,并且在构造之前无法访问它。