您的位置:首页 > 其它

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

2015-08-26 18:59 363 查看
写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集合。

完。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: