在全局对象(不是指针)的构造函数里不要对std集合做太多操作
2015-08-26 18:59
363 查看
写MaxvisionOnvif的时候,我用个宏把每个Command类注册到了CommandBuilder里面,通过全局对象初始化实现的,如下:
这里通过宏创建了全局对象,在构造函数里面把命令字符串和创建子command的函数注册到了m_allCommand集合(std::vector)里面。
在每个子command的cpp文件里,这样注册,如:
FocusCmd.cpp:
这样做开始子命令个数不多的时候,能正常使用,但数量多了和std就报错。
关键错误信息:
google之:
得到这些网页:
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集合。
完。
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集合。
完。
相关文章推荐
- 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(hdoj--2191--多重背包)
- php get_magic_quotes_gpc()函数用法介绍
- Aptana插件安装到eclipse和myeclipse的详细过程
- Provisioning Services 7.6 入门到精通系列之七:创建虚拟磁盘
- Linux系统调用--getrusage函数详解
- hdu 2546 饭卡(0-1背包)
- ActiveMQ学习资料
- Desgin of Instant Messaging Client
- VMware Workstation 12 Pro 正式发布(附带下载地址)
- Bone Collector(hdoj--2602--01背包)
- Unity3D里Time时间体系的讲解与运用
- 有了 Linux,你就可以搭建自己的超级计算机
- linux 统计 程序运行时间
- 单选框、复选框、下拉列表
- Bone Collector(hdoj--2602--01背包)
- 贪心+枚举/哈希表 HDOJ Trouble
- UI基础_transform
- TVP批量插入数据
- hdu2112- HDU Today
- SQLSERVER 获取datetime日期的查询语句