運行一些傳給我的舊代碼時遇到問題。它的工作時間爲99%,但有一段時間,我注意到它拋出了「違規閱讀位置」例外。我有可變數量的線程可能在整個生命週期中執行此代碼。發生頻率低可能表示競賽狀況,但我不知道爲什麼會在這種情況下導致例外。這是有問題的代碼:違規讀取std :: map運算符中的位置[]
MyClass::Dostuff()
{
static map<char, int> mappedChars;
if (mappedChars.empty())
{
for (char c = '0'; c <= '9'; ++c)
{
mappedChars[c] = c - '0';
}
}
// More code here, but mappedChars in not changed.
}
的異常被拋出在地圖上的operator []的實現,在第一個調用operator []的(使用STL的VS2005執行。)
mapped_type& operator[](const key_type& _Keyval)
{
iterator _Where = this->lower_bound(_Keyval); //exception thrown on the first line
// More code here
}
我已經嘗試凍結運算符[]中的線程,並試圖讓它們在同一時間運行它,但我無法使用該方法重現異常。
你能想到爲什麼會拋出什麼原因,只有一些時間?
(是的,我知道STL是不是線程安全的,我需要在這裏做出改變。我主要是好奇,爲什麼我看到我上面所述的行爲。)
按照要求,這裏有一些關於異常的更多細節:
app15-51-02-0944_2008-10-23.mdmp中的0x00639a1c(app.exe)未處理異常:0xC0000005:訪問衝突讀取位置0x00000004。
感謝大家提出多線程問題的解決方案,但這不是這個問題要解決的問題。是的,我知道所提供的代碼沒有得到正確保護,並且它試圖完成的任務過於龐大。我已經有了它的實施修復。我只是想更好地理解爲什麼這個異常是從一開始就拋出的。
瞭解違規地址可能會有用。可能「this」爲空,它與地圖本身無關。 – 2008-10-23 23:07:42