在全局对象(不是指针)的构造函数里不要对std集合做太多操作

写MaxvisionOnvif的时候,我用个宏把每个Command类注册到了CommandBuilder里面,通过全局对象初始化实现的,如下:

void CommandBuilder::RegisterNewCommand(std::string cmd,FnCreateHandle cb)
{
    m_allCommand.insert(std::pair<std::string,FnCreateHandle >(cmd,cb));
}

#define NEW_HANDLE(classType)    Command* CreateNewCommand_ ## classType (){ return new classType(); };
#define NEW_COMMAND(strCmd,classType)        CommandBuilder cBuilder_ ## classType(strCmd,CreateNewCommand_ ## classType);
#define REGISTER_COMMAND(strCmd,classType)    NEW_HANDLE(classType); NEW_COMMAND(strCmd,classType);

这里通过宏创建了全局对象,在构造函数里面把命令字符串和创建子command的函数注册到了m_allCommand集合(std::vector)里面。

在每个子command的cpp文件里,这样注册,如:

FocusCmd.cpp:

#include "stdafx.h"
#include "FocusCmd.h"

REGISTER_COMMAND("onvifFocus",FocusCmd);

FocusCmd::FocusCmd()
{
}

FocusCmd::~FocusCmd(void)
{
}

 

这样做开始子命令个数不多的时候,能正常使用,但数量多了和std就报错。

关键错误信息:

Nodeptr _Trynode = _Root(); 

google之:

Nodeptr _Trynode = _Root(); error

得到这些网页:

http://stackoverflow.com/questions/1041099/unusual-stdmap-runtime-error

http://stackoverflow.com/questions/16501363/stomped-cant-insert-value-in-a-static-map-container

http://www.parashift.com/c++-faq/static-init-order.html

都是说std未初始化导致的。

 

所以,需要自己用单链表实现一个vector,不要使用std集合。

 

完。

posted @ 2015-08-26 18:59  liyou  阅读(457)  评论(0编辑  收藏  举报