2017-02-26 38 views
0

我有一個奇怪的問題,我似乎無法取得任何進展。我有一個out_of_range使用std :: map :: at(const char *),編譯時使用/ 02

std::unordered_map<char*, MyType>

,每當我試圖用

at(const char*) 

訪問拋出out_of_range例外,儘管肯定包含所提供的密鑰。

它不拋出此異常的唯一方法是使用/ 02(Optimize for Speed)構建時,在返回調試並將優化標誌更改爲禁用時發現它。

當我在()使用的地方休息時,看看我的地圖,它看起來非常好,關鍵在那裏,但異常仍然拋出。

任何有這樣的問題嗎?

std::unordered_map<char*, GUISetting> objectSettings = {{"Loot Containers", GUISetting("Loot Containers", LootContainerNames, true)}}; 

UI.objectSettings.at("Loot Containers").Enabled = iniReader.ReadBoolean("ObjectESP", "LootContainers", true); 
+0

發表一些說明問題的代碼。 –

+0

請添加一個[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。這將更容易幫助你,然後 – mpiatek

回答

3

std::unordered_map比較了使用==的鑰匙,所以它檢查你的字符指針是否指向同一個內存位置,它們指向相同的字符串。

如果您希望std::unordered_map比較char指針所指向的字符串,則需要將映射作爲模板參數傳遞給自定義比較器。或者以簡單的方式完成並使用std::string作爲關鍵類型。

+1

這也解釋了爲什麼當'/ O2'被指定,因爲它暗示[/GF](https://msdn.microsoft.com/en-us/library/s0s0asdt.aspx ) – mpiatek

+0

我假設編譯時使用了/ 02編譯器將所有重複的字符串映射到相同的內存地址,並且當沒有使用優化時,每個字符串都有獨立的位置,即使它們是相同的? 編輯:剛剛閱讀關於字符串池,謝謝你們。 – user4822305

0

附加@tuple_cat答案,你可以把你所有的字符串常量在一個地方:

common_const.h

extern const char LOOT_CONTAINERS[]; 
extern const char SOMETHING_ELSE[]; 

common_const.cc

const char LOOT_CONTAINERS[] = "Loot Containers"; 
const char SOMETHING_ELSE[] = "Something Else"; 

,然後跨代碼中使用此常數代替。鉻源中使用的類似方法。但是,如果您嘗試以某種方式從用戶輸入或任何其他來源獲取密鑰,這將不起作用。或者,您可以使用std::unordered_map<std::string, GUISetting>

相關問題