2013-05-11 47 views
2

出于某种原因,我不能将值插入到静态地图容器中。我使用VS2010,这里是我的代码在静态地图容器中拼命插入值

Header File 
class MyClass 
{ 
    static std::map<std::string,std::string> config_map; 
    static void SomeMethod(); 
}; 

Cpp File 
std::map<std::string,std::string> MyClass::config_map ; 

void MyClass::SomeMethod() 
{ 
... 
config_map.insert(std::pair<std::string,std::string>("dssd","Sdd")); //ERROR 
} 

这是错误,我得到

Unhandled exception at 0x0130ca29 in Test.exe: 0xC0000005: Access violation reading location 0x00000004.

我也试过config_map["str"] = "something"。看来我不能在其中插入任何东西。有什么建议么 ?

这个断点在土地的XTree

_Pairib _Linsert(_Nodeptr _Node, bool _Leftish) 
     { // try to insert node at _Node, on left if _Leftish 
     const value_type& _Val = this->_Myval(_Node); 

     _Nodeptr _Trynode = _Root(); //Breakpoint lands here 
     _Nodeptr _Wherenode = this->_Myhead; 
     bool _Addleft = true; // add to left of head if tree empty 
     while (!this->_Isnil(_Trynode)) 
      { // look for leaf to insert before (_Addleft) or after 
      _Wherenode = _Trynode; 
      if (_Leftish) 
       _Addleft = !_DEBUG_LT_PRED(this->comp, 
        this->_Key(_Trynode), 
        this->_Kfn(_Val)); // favor left end 
      else 
       _Addleft = _DEBUG_LT_PRED(this->comp, 
        this->_Kfn(_Val), 
        this->_Key(_Trynode)); // favor right end 
      _Trynode = _Addleft ? this->_Left(_Trynode) 
       : this->_Right(_Trynode); 
      } 
+1

你怎么称呼你的SomeMethod()?你确定在'.insert'调用发生异常吗?异常文本显示有一些NULL指针被取消引用。它看起来大多像是其他地方的错误。 – Inspired 2013-05-11 20:28:41

+0

我肯定确定它发生在插入,因为我正在逐句通过陈述 – MistyD 2013-05-11 20:33:11

+0

Somemethod()被另一个静态方法调用 – MistyD 2013-05-11 20:34:19

回答

3

看起来,地图没有正确地初始化,当你写入它。除了制作地图static之外,您可以使MyClass的对象成为全局变量或静态成员。然后在类的构造函数中初始化映射应该可以工作。

静态对象跨不同的.cc文件(我猜是这种情况:写入是从另一个模块执行的)的初始化顺序未定义。

+0

谢谢。你能解释一下你的意思吗?另外我对初始化顺序感到惊讶。我在地图上方声明了一个静态矢量,它也是静态的,并且矢量被初始化并且地图不是 – MistyD 2013-05-11 22:53:52

+0

我刚刚提出了另一种初始化地图的方法:将类定义为类class MyClass {public:std :: map <...> config_map ; MyClass(){config_map.insert(“A”,“B”); }};'然后声明一个类的静态实例:'MyClass global_myclass;'。在这里,对象将被正确构建,并且您将能够通过'myclass.config_map'访问地图(尽管不是从其他静态对象的初始化)。 – Inspired 2013-05-12 07:49:46

4

从评论,它看起来像你正在寻找的static initialization order fiasco

会发生什么情况:不保证不同翻译单元中静态对象的初始化顺序。你碰到这种情况,那是你不想要的订单。

+0

我只是在初始化顺序感到惊讶。我在地图上方声明了一个静态矢量,这个静态矢量也是静态的,矢量被初始化并且地图不在 – MistyD 2013-05-11 22:54:56

+0

@MistyD即使随机代码混洗使问题消失,也不能保证问题不会出现在另一个问题上平台,另一个编译器,当前编译器的另一个版本,或暴风雨天气。 ;)查看下一个常见问题解答条目,寻找类似于Inspired建议的解决方案。 – pmr 2013-05-12 00:34:41