2017-02-26 2 views
0

私は頭がおかしくないような奇妙な問題があります。私はout_of_range std :: map :: at(const char *)を使用して/ 02でコンパイルする場合を除いて

at(const char*) 

にアクセスしようとしたときに、確かに付属のキーを含むにもかかわらず、out_of_range例外をスローすること

std::unordered_map<char*, MyType>

を持っています。

この例外が発生しない唯一の方法は、デバッグをバックにして最適化フラグを無効に変更するときに検出される/ 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==を使用してキーを比較し、彼らが同じ文字列を指すものではない、あなたのcharポインタが同じメモリ位置を指しているかどうかをチェックです。

std::unordered_mapにcharポインタが指し示す文字列を比較させたい場合は、マップをカスタムパラメータとしてテンプレートパラメータとして渡す必要があります。または、簡単な方法で、std::stringをキータイプとして使用します。

+1

これは、/ O2が指定されたときになぜ動作するのかを説明するものでもあります。[/GF](https://msdn.microsoft.com/en-us/library/s0s0asdt.aspx) ) – mpiatek

+0

コンパイル時に/ 02とコンパイルすると、すべての重複した文字列が同じメモリアドレスにマップされ、最適化が使用されていないときは、たとえ同じ文字列であっても、 編集:ちょうど文字列のプール、おかげでみんなについて読む。 – user4822305

0

使用すると、1つの場所ですべての文字列定数を置くことができ答える@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"; 

、コード全体に代わり、この定数を使用します。 Chromiumソースでも同様のアプローチが採用されています。しかし、あなたが何らかの形でユーザーの入力や他のソースからキーを取得しようとすると、これはうまくいかないでしょう。あるいは、std::unordered_map<std::string, GUISetting>を使用することもできます。

関連する問題