C++全局對象的初始化順序問題思考

問題產生:

  在代碼中的某個頭文件定了幾個全局的 const std::string ,同時定義了某個類,在類的構造函數中使用了這幾個全局變量。

該類作爲單例模板的成員被使用了,單例的編譯在另外一個單元。

程序編譯鏈接正常,運行時候segment fault

gdb調試const 成員變量,內存不可訪問

分析該問題需要具備的基礎知識:

知識一:

全局變量文件域的靜態變量類的靜態成員變量在main執行之前的靜態初始化過程中分配內存並初始化

局部靜態變量(一般爲函數內的靜態變量)在第一次使用時分配內存並初始化。這裏的變量包含內置數據類型和自定義類型的對象。

知識二:

對於出現在同一個編譯單元內的全局變量來說,它們初始化的順序與他們聲明的順序是一致的(銷燬的順序則反過來),而對於不同編譯單元間的全局變量,c++ 標準並沒有明確規定它們之間的初始化(銷燬)順序應該怎樣,因此實現上完全由編譯器自己決定,一個比較普遍的認識是:不同編譯單元間的全局變量的初始化順序是不固定的,哪怕對同一個編譯器,同一份代碼來說,任意兩次編譯的結果都有可能不一樣。

問題解決:

方案一:

使用宏替換了const變量

方案二:

由於這幾個常量只在定義的類中用到,放在了類成員裏。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章