問題產生:
在代碼中的某個頭文件定了幾個全局的 const std::string ,同時定義了某個類,在類的構造函數中使用了這幾個全局變量。
該類作爲單例模板的成員被使用了,單例的編譯在另外一個單元。
程序編譯鏈接正常,運行時候segment fault
gdb調試const 成員變量,內存不可訪問
分析該問題需要具備的基礎知識:
知識一:
全局變量、文件域的靜態變量和類的靜態成員變量在main執行之前的靜態初始化過程中分配內存並初始化;
局部靜態變量(一般爲函數內的靜態變量)在第一次使用時分配內存並初始化。這裏的變量包含內置數據類型和自定義類型的對象。
知識二:
對於出現在同一個編譯單元內的全局變量來說,它們初始化的順序與他們聲明的順序是一致的(銷燬的順序則反過來),而對於不同編譯單元間的全局變量,c++ 標準並沒有明確規定它們之間的初始化(銷燬)順序應該怎樣,因此實現上完全由編譯器自己決定,一個比較普遍的認識是:不同編譯單元間的全局變量的初始化順序是不固定的,哪怕對同一個編譯器,同一份代碼來說,任意兩次編譯的結果都有可能不一樣。
問題解決:
方案一:
使用宏替換了const變量
方案二:
由於這幾個常量只在定義的類中用到,放在了類成員裏。