关于map,insert就报错的问题

yjnjiajia 2007-09-11 10:47:48
定义如下 static std::map<std::string, void*> gMap;在没有进入全局的app对象构造函数之前先gMap.insert的时候就出错了(因为我定义的是静态的gMap,插入的地方也是静态的函数,肯定在全局的app构造函数之前调用的动作,一旦进入了app之后再去insert就没有问题),观察发现((gMap)._Tr)._Head = NULL,怀疑是没有初始化引起的,请大侠指教。
...全文
881 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjnjiajia 2007-09-11
  • 打赏
  • 举报
回复
这方法是可以的,保证了先构造在调用,非常感谢~~~
  • 打赏
  • 举报
回复
果然是没有构造的问题,那么怎么能让gMap比其他静态函数先构造呢?
====================
没有办法的,C++并没有约束静态成员变量的构造顺序.
你可以使用单件的方法进行使用.
std::map<std::string, void*>& func()
{
//增加线程安全的代码
static std::map<std::string, void*> Map;
return Map;
}
然后这样使用
func().insert
yjnjiajia 2007-09-11
  • 打赏
  • 举报
回复
还是一样的,而且我要作为类的成员变量,去掉了容易产生重名冲突
ToperRay 2007-09-11
  • 打赏
  • 举报
回复
std::map<std::string, void*> gMap;
把static去掉试验一下
yjnjiajia 2007-09-11
  • 打赏
  • 举报
回复
果然是没有构造的问题,那么怎么能让gMap比其他静态函数先构造呢?
  • 打赏
  • 举报
回复
静态对象的内存分配是在程序加载后就分配好了
至于构造函数是否调用那就不一定了
你这样试试看;
std::map<std::string, void*> func()
{
std::map<std::string, void*> Map;
....
insert;
return Map;
}
static std::map<std::string, void*> gMap = func();
yjnjiajia 2007-09-11
  • 打赏
  • 举报
回复
gMap肯定构造成功了,内存地址都分配了
  • 打赏
  • 举报
回复
你要确保,gMap已经构造成功了,都是全局的变量那么他们的构造顺序,不确定
所以使用其他方法来保证已经构造这个对象成功了

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧