2010-11-24 64 views
0

我正在從Visual Studio 2008 - > 2010更改,並且在評估std ::指針集上的查找時,我在代碼中遇到了一個奇怪的錯誤。Visual C++ 2010 std :: set find broken

我知道這個版本帶來了一個變化,其中set :: iterator與set :: const_iterator具有相同的類型,以便與標準產生一些兼容性。但我不明白爲什麼以前工作的這部分代碼現在會導致崩潰?

void checkStop(Stop* stop) 
{ 
    set<Stop*>      m_mustFindStops; 
    if (m_mustFindStops.find(stop) != m_mustFindStops.end()) // this line crashes for some reason?? 
    { 
     // do some stuff 
    } 
} 

PS m_mustFindStops在崩潰時爲空。

編輯:感謝您的快速回復......我無法讓它重現一個簡單的案例 - 這可能不是一個問題與設置其自我。我認爲堆腐敗可能是一個罪魁禍首 - 我只是想知道爲什麼更改編譯器會突然導致相同代碼和相同輸入數據的損壞。

+2

沒有repro。請發佈完整的可編譯示例。 – 2010-11-24 03:25:08

+2

我無法重現錯誤。這表明其他事情出錯了。重現錯誤並且我們可以運行的最小可編譯示例將是完美的。 – 2010-11-24 03:28:41

回答

1

我能想到的唯一的事情就是你有多個線程,並且m_mustfindStops實際上是成員或全局變量,而不是本地函數。上面的代碼無法解決問題,如果正確並且單獨採用的話。

如果您有多個線程,那麼與寫入訪問併發的讀取訪問將導致隨機錯誤 - 即使容器看起來爲空,它可能不會在調用find時啓動。

另一種可能是某些其他代碼損壞了堆,但是在這種情況下,使用堆內存的任何代碼都可能出現故障。考慮到這一點,如果總是這個邏輯斷裂,我的賭注就會出現線程問題。

btw - 在Visual C++ v10中std::set絕對沒有錯 - 您的代碼必須有錯誤。