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