2013-05-11 80 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