c++ 全局變量依賴初始化問題

今天調試一個程序時候,出現了一個頗有趣問題。一開始程序沒有問題,我新增了幾個類。
這些類,都有使用反射方式加載。 其中的註冊,寫了一個Map,用來保存。
代碼以下:函數

xxx.h文件spa

class CLocoProctorFactory {
public:
    CLocoProctorFactory();
    ~CLocoProctorFactory();
private:
    std::map<std::string, CBaseLocoProc*> base_funs_;
public:
    void add_fun(std::string& name, base_create_class_fun fun);
    CBaseLocoProc *spawn(std::string& name);
};調試

extern CLocoProctorFactory base_factory;string

而後這個base_factory 真正的定義在cpp文件中。class

一開始,我調試了好久,沒有找出緣由。由於add_fun仍是正確調用的。 只是在對base_funs賦值時候,纔會出錯。
而後VC調試顯示 base_funs_ 的size是0。 都沒有問題。
後面我在,這個CLocoProctorFactory()構造函數中,加了代碼(最開始是麼有代碼的),下了斷點。發現他不會調用,變量

問題找到了,這個說明VC2013 調試器其實對於複雜的代碼,沒有想象中那麼好。這裏就沒有判斷出,其實他沒有初始化。
說明,當多個文件都包含全局變量時候,C++ 的構造順序和在同一個文件中,順序實際上是不一樣的。多個文件的全局變量
其實構造順序是未知的。解決辦法以下:構造函數

xxx.h文件map

CLocoProctorFactory *GetBaseFactory();反射

.cpp中
CLocoProctorFactory *GetBaseFactory()
{
    static CLocoProctorFactory base_factory;
    return &base_factory;
}
好了解決了。程序

相關文章
相關標籤/搜索