![](/img/trans.png)
[英]How to initialize a static member variable using a static member function at runtime?
[英]Static member function to initialize static member variable - usage and risks?
在In MyClass.h中
class MyClass
{
static vector<type> types;
static vector<type> createTypes();
}
在MyClass.cpp中
vector<type> MyClass::types = createTypes();
MyClass::MyClass()
{
}
什么时候执行createTypes()并且这种初始化静态变量的方法是否涉及任何风险?
在main()
启动之前,该函数将与其他静态初始化程序一起调用。 除了使用其他静态初始化方法之外,您不会冒任何风险。
请记住,所有静态初始化器都应设计成避免触发SIOF - 静态初始化命令Fiasco。
同一翻译单元中的静态初始化程序按其在文件中声明的顺序执行。 然而,在多个翻译单元初始化顺序没有定义。 当静态初始化程序依赖于另一个转换单元时,SIOF就会出现。
然后,根据月亮的相位,要么两个对象都将以正确的顺序初始化并且一切都会起作用,或者它们将以相反的顺序初始化并且您将使用尚未构造的对象 - 接着会出现未定义的行为。
SIOF-guard模式通过替换如下的静态变量来避免这种情况:
std::list<Foo> gFoos;
...使用包含变量作为本地静态的函数:
std::list<Foo> &gFoos() {
static std::list<Foo> theList;
return theList;
}
这样,变量总是在函数的第一次调用时初始化,并且在构造之前无法访问它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.