静态成员函数初始化静态成员变量 - 用法和风险?

时间:2015-06-23 14:55:52

标签: c++

在案件中 在MyClass.h中

class MyClass 
{
    static vector<type> types;
    static vector<type> createTypes();
}

在MyClass.cpp中

vector<type> MyClass::types = createTypes();

MyClass::MyClass()
{
}

什么时候执行createTypes()并且这种初始化静态变量的方法是否涉及任何风险?

1 个答案:

答案 0 :(得分:2)

main()启动之前,将与其他静态初始化程序一起调用该函数。除了使用其他静态初始化方法之外,您不会冒任何风险。

请记住,所有静态初始化程序都应设计为避免触发SIOF - 静态初始化顺序Fiasco。

同一翻译单元中的静态初始化程序按其在文件中声明的顺序执行。但是,跨多个翻译单元的初始化顺序是定义。当静态初始化程序依赖于另一个翻译单元时,会出现SIOF。

然后,根据月亮的相位,两个对象都将以正确的顺序初始化并且一切都会起作用,或者它们将以相反的顺序初始化并且您将使用尚未构造的对象 - 未定义行为随之而来。

SIOF-guard模式通过替换如下的静态变量来避免这种情况:

std::list<Foo> gFoos;

...使用包含变量作为本地静态的函数:

std::list<Foo> &gFoos() {
    static std::list<Foo> theList;
    return theList;
}

这样,变量在函数的第一次调用时始终初始化,并且在构造之前无法访问它。