2011-04-19 55 views
2

這一定是我做一些愚蠢的事,但有沒有人看到這種行爲之前:STL ::地圖問題

我有一類成員的地圖定義,像這樣:

std::map <const std::string, int> m_fCurveMap; 

所有行爲都正常在調試中,但在發佈模式下都會出錯。地圖被初始化爲一些瘋狂的數字:m_fCurveMap [14757395258967641292]()

的任何成員,我已經後的地圖被完全破壞,也就是說,如果我把一個int就行了地圖像這樣經過:

std::map <const std::string, int> m_fCurveMap; 
int m_myIntThing; 

,並在我的構造函數將m_myIntThing設置爲0,在構造函數被調用後m_myIntThing是一些瘋狂的數字。如果我將m_myIntThing移動到地圖上方的行,那麼m_myIntThing的所有內容都可以。這最終會給我帶來更大的問題。我需要在構造函數中對地圖做些什麼嗎?我現在不在。

我使用Visual Studio,這工作得很好用gcc。我只看到發佈中的問題。該項目是一個DLL。

如果你已經看到了這種瘋狂的前請幫助其駕駛我瘋了。 :-)

非常感謝, 馬克

+1

其他東西可能會損壞它。這是所有人都可以告訴你的。現在,您必須正確調查您的程序以查看原因,或向我們顯示代碼。 – GManNickG 2011-04-19 23:13:32

+0

你不應該參考'stl :: map'。首字母縮略詞STL不是標準的一部分。 – 2011-04-19 23:14:59

+0

地圖如何初始化爲一個數字? – 2011-04-19 23:15:42

回答

0

你是混合調試應用程序釋放DLL?

否則,它聽起來像內存損壞,雖然我不能肯定地說。

  • 別的東西跺腳內存
  • 您正在訪問刪除內存
  • 你返回一個臨時的指針或引用

任何這些可能出現在某些情況下工作良好,因爲它們是未定義的行爲,只有在發佈模式下它們會爆炸。

3

這發生在我身上很多次。雖然很難說您的情況,但很可能的原因是您在不同項目之間有不同版本的C運行時庫。在編譯器設置中檢查您的「代碼生成」選項卡,以確定它們是否相同。

什麼是有效的情況是,不同版本的C運行時庫中以不同方式實現STL容器。然後,當不同的項目試圖互相交流時,std :: map(例如)的含義已經發生變化,不再是二進制兼容的。

奇怪的行爲,很可能某種堆損壞,或者如果它被作爲參數傳遞給函數,堆棧損壞。

1

問題是某種內存損壞。

,我已經看到經常在C++項目使用的對象已被刪除後的一個錯誤。

另一種可能性是緩衝區溢出。它可以是堆棧上或附近的任何對象。

捕捉罪魁禍首的一個非常好的方法是設置一個調試器斷點,引發內存變化。雖然該對象仍然很好,但請設置斷點。然後等到某些代碼寫入該內存位置。這應該會揭示你的錯誤。

1

如果您從VS調試器獲取您的信息,我不會相信它會告訴您發佈DLL的信息。調試器只能通過調試DLL真正被信任。

如果程序輸出告訴你這個,那就不同了 - 在這種情況下,你沒有提供足夠的信息。

+0

嗨,謝謝你,這幾乎是造成這個問題的原因。沒有發佈所有代碼的原因是它涉及多個dll,可能不會有很大的幫助。我想排除我可能用stl的東西做的任何愚蠢行爲。我總是很緊張,因爲似乎有很多問題需要解決。無論如何,我現在已經修復了,我的一個dll被調試編譯並拋出誤導性數據。一旦我改變了我能夠找到真正的問題。非常感謝所有回答的人。 – mark 2011-04-20 22:19:55

0

我在g ++上遇到了同樣的問題,我通過在pragma段落中刪除雜注來解決它。儘管代碼是正確的,但我不知道這是否是在某些情況下使用stl :: map時出現的平臺上的編譯器錯誤。

#pragma pack(push,1) 
xxxx 
#pragma(pop) 
0

只給一個具體的例子爲存儲器訛誤:

typedef std::map<int, int> mymap_t; 

static mymap_t static_init() { return mymap_t(); } 

class foo { 
    foo(): mymap(static_init()) {} 

    //!> d'oh, don't reference! 
    const mymap_t &mymap; 
}; 

不留神,我定義了一個裁判的成員變量,而不是成員變量本身。它初始化好了,但只要static_init()的作用域被留下,地圖就會被銷燬,ref會在調試時顯示爲「std :: map with 140737305218461 elements」(漂亮的印刷)或類似的指出現在未分配的存貨(或更糟)。

謹防意外引用!