c++ 全局变量依赖初始化问题

今天调试一个程序时候,出现了一个很有趣问题。一开始程序没有问题,我新增了几个类。
这些类,都有使用反射方式加载。 其中的注册,写了一个Map,用来保存。
代码如下:

xxx.h文件

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;

然后这个base_factory 真正的定义在cpp文件中。

一开始,我调试了很久,没有找出原因。因为add_fun还是正确调用的。 只是在对base_funs赋值时候,才会出错。
然后VC调试显示 base_funs_ 的size是0。 都没有问题。
后面我在,这个CLocoProctorFactory()构造函数中,加了代码(最开始是么有代码的),下了断点。发现他不会调用,

问题找到了,这个说明VC2013 调试器其实对于复杂的代码,没有想象中那么好。这里就没有判断出,其实他没有初始化。
说明,当多个文件都包含全局变量时候,C++ 的构造顺序和在同一个文件中,顺序其实是不同的。多个文件的全局变量
其实构造顺序是未知的。解决办法如下:

xxx.h文件

CLocoProctorFactory *GetBaseFactory();

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

转载于:https://my.oschina.net/u/3069007/blog/3054440

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值