在全局对象(不是指针)的构造函数里不要对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集合。

完。

时间: 2024-12-28 08:48:19

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

全局对象的构造函数会在main 函数之前执行

#include <iostream> using namespace std; class A { public: A() { cout << "Generator A" << endl; } } a = A(); int main() { cout << "Hello World" << endl; } 全局对象的构造会在main函数之前执行.

你会如何给全局对象添加toString()方法

首先,在讨论如何给所有方法window对象添加tostring方法的时候,我们先来说说window的对象继承与对象实例,以及构造函数的this指针,还有变量的提升与方法的调用方式,最终一探window对象与Window方法(函数)的处理方式. 在说window对象之前,请让我们一起写一个实例的方法暖暖身,跳水之前应该做热身动作,虽然我们不跳水,不过写代码也需要做一个热身,这样才能适应下面的高难度动作. 废话好多,裁判看不下去了,开始准备你的姿势,让我们开场就拿个满分,吓死裁判,但是看到裁判吓到自

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

JavaScript中两种类型的全局对象/函数

这里所说的JavaScript指浏览器环境中的包括宿主环境在内的. 第一种是ECMAScript Global Object,第二种是宿主环境(Host)下的全局对象/函数. 一.核心JavaScript内置对象,即ECMAScript实现提供的不依赖于宿主环境的对象 这些对象在程序执行之前就已经(实例化)存在了.ECMAScript称为The Global Object,分为以下几种 1, 值属性的全局对象(Value Properties of the Global Object).有NaN

JavaScript 全局对象

JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScript 对象. 顶层函数(全局函数) 函数 描述 decodeURI() 解码某个编码的 URI. decodeURIComponent() 解码一个编码的 URI 组件. encodeURI() 把字符串编码为 URI. encodeURIComponent() 把字符串编码为 URI 组件. escape() 对字符串进行编码. eval() 计算 JavaScript 字符串,并把它作为脚本代码来执行. getC

[百度空间] [转] 在 Visual C++ 中控制全局对象的初始化顺序

from: http://blog.csdn.net/classfactory/archive/2004/08/07/68202.aspx 在 C++ 中,同一个翻译单位(.cpp文件)里的全局对象的初始化顺序是先定义的对象先初始化(同时也后析构),但 C++ 标准并没有规定不同翻译单位间全局对象的初始化顺序.按照这个分析,以下的代码可能工作,也可能不工作(cout 是 C++ 用于输出的全局对象,和我们自己的对象位于不同的翻译单位): class A {    A() {        cou

JavaScript基础学习之-JavaScript权威指南-3.5全局对象

全局对象 全局对象的属性可以直接用. JavaScript解释器启动或是任何web浏览器加载新页面的时候,都会创建新的全局对象,并给它一组定义的初始属性: 构造函数 描述 Date 日期对象 RegExp 正则表达式对象 String 字符串对象 Object object对象 Array 数组对象 全局对象 描述 Math 数学类计算 JSON json 全局函数 描述 decodeURI() 解码某个编码的 URI. decodeURIComponent() 解码一个编码的 URI 组件.

全局对象

定义: 全局对象(global object)在JavaScript中有着重要的用途,全局对象的属性是全局定义的符号,JavaScript可以直接使用,比如: 全局属性 undefined,infinity和NaN 全局函数 isNaN(),parseINt(),eval()) 构造函数 Date(),RegExp(),String(),Object(),Array() 全局对象 Math 包装对象: JavaScript对象是第一种复合值:他是属性或已命名值的集合.通过"."符号来引

nodejs 全局对象

1. 全局对象console的五个方法: log   dir    time  timeEnd  error 2. 在前端中全局对象Window中定义了consle这个对象 3. 在nodejs中全局对象是global,在global中定义了console. 4. setInterval也是global中定义的全局对象 5. setTimeout也是global中定义的全局对象 6. __dirname 也是全局对象,表示当前文件所在的路径 7. __filename也是全局对象,表示当前文件所