今天调试一个程序时候,出现了一个很有趣问题。一开始程序没有问题,我新增了几个类。
这些类,都有使用反射方式加载。 其中的注册,写了一个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;
}
好了解决了。