2013-03-02 81 views
0

我有如下所示C++:性病::地圖拋出out_of_range異常

template <typename KeyType, typename ValueType> 
KeyType IDSystem<KeyType,ValueType>::registerParameter(const ValueType& value) 
{ 
    KeyType key = __IDCounter++; 
    _Map[key] = value; //crashes here 
    return key; 
} 

其中_MAP是

std::map<KeyType, ValueType> _Map; 

用於崩潰,其中所指示的程序的代碼,然後我取代該行與

_Map.at(key) = value; //out_of_range thrown here 

現在程序拋出一個std :: out_of_range異常在同一行...

KeyType是來自標準庫的int64_t,而ValueType是指向某個類的指針(如MyClass *)。

令人驚訝的是,我使用的std ::地圖就像沒有發生問題之前......和。

我使用std :: map不正確嗎?請指教。

+1

如果密鑰在地圖中不存在,則預計會出現out_of_range:http://www.cplusplus.com/reference/map/map/at/ – JaredC 2013-03-02 18:57:31

+1

就目前而言,您的代碼具有未定義的行爲,因爲兩者都存在'__IDCounter'和'_Map'被保留用於實現。 – 2013-03-02 19:01:59

+0

@JaredC感謝您的回答。我應該如何添加一個新的密鑰?我在一本名爲Professional C++的書中讀到,運算符[]應該在不存在時分配鍵。 – 2013-03-02 19:02:28

回答

1

問題不在地圖中。這個類的指針沒有被正確初始化,導致了這個問題。

非常感謝您所做的一切努力,並對這個令人誤解的問題表示歉意。

1

您可能希望使用find而不是[]運算符,因爲如果您嘗試訪問不存在的鍵,它會返回一個過去末端的迭代器。

關於你的代碼,請花時間來發布SSCCE,因爲我看不出什麼錯在上面的代碼中的幾行。

+0

其實我想值分配給該鍵。運營商是否應該這樣做? – 2013-03-02 19:03:43

+0

@Samer是的,'operator []'就是這麼做的,所以你的代碼有什麼問題並不明顯。 SSCCE對我們會很有幫助。 – JaredC 2013-03-02 19:05:12

+0

好的,謝謝。我會試着看看我能否做出這樣的例子! – 2013-03-02 19:09:51

1

的代碼(從,可能是不傷害任何下劃線名稱除外)寫得很好,所以這個問題是最有可能在其他地方。特別是,如果免費商店已經損壞(通過刪除一個沒有新建的指針,或者運行一個已分配塊的末尾),這些症狀幾乎可以在任何使用免費商店的地方顯示出來。 map::operator[]當你給它一個不在地圖上的密鑰時,它會使用免費的商店,所以我懷疑這是問題所在:別的東西炸燬了堆。

1

out_of_range例外是讀鯡魚,是一個不同的問題,您的原始崩潰的問題。

問題是,當你這樣做:

_Map[key] = value; 

所以,你正在做的一項任務。
這表明你有一個不好的賦值操作符(或者你在賦值操作符中做的事情正在碰到其他不好的代碼)。

因爲我們不知道什麼是ValueType我們不能診斷問題超出了這一點。我可以建議你檢查你是否在執行rule of 3(5) correctly

如果您提供的ValueType和賦值操作符的定義,我們也許能夠進一步幫助。通常對於這種類型的問題,最好將問題簡化爲可以產生問題併發布的最小可編譯示例。