![](/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.