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;
}
好了解决了。程序

相关文章
相关标签/搜索