C++ 使用std::map::at(const char*)超出范围,使用/02编译时除外

C++ 使用std::map::at(const char*)超出范围,使用/02编译时除外,c++,C++,我有一个奇怪的问题,我似乎无法取得任何进展。我有一个 std::无序地图 每当我试图用 at(const char*) 抛出out_of_range异常,尽管它确实包含提供的密钥 它不会引发此异常的唯一方法是在使用/02(速度优化)构建时,这是在返回调试并将优化标志更改为禁用时发现的 当我在使用at()的地方中断并查看我的映射时,它看起来非常好,并且键在那里,但是仍然抛出异常 有人有过这样的问题吗 std::unordered_map<char*, GUISetting> obje

我有一个奇怪的问题,我似乎无法取得任何进展。我有一个


std::无序地图

每当我试图用

at(const char*)
抛出out_of_range异常,尽管它确实包含提供的密钥

它不会引发此异常的唯一方法是在使用/02(速度优化)构建时,这是在返回调试并将优化标志更改为禁用时发现的

当我在使用at()的地方中断并查看我的映射时,它看起来非常好,并且键在那里,但是仍然抛出异常

有人有过这样的问题吗

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

UI.objectSettings.at("Loot Containers").Enabled = iniReader.ReadBoolean("ObjectESP", "LootContainers", true);
std::无序映射对象设置={{{“Loot Containers”,GUISetting(“Loot Containers”,LootContainerNames,true)};
UI.objectSettings.at(“Loot Containers”).Enabled=iniReader.ReadBoolean(“ObjectESP”,“Loot Containers”,true);

std::unordered_map
使用
=
比较键,因此它检查字符指针是否指向相同的内存位置,而不是指向相同的字符串


如果希望
std::unordered_map
比较字符指针指向的字符串,则需要将自定义比较器作为模板参数传递给映射。或者简单地使用
std::string
作为键类型。

std::unordered\u map
使用
=
比较键,因此它检查字符指针是否指向相同的内存位置,而不是指向相同的字符串


如果希望
std::unordered_map
比较字符指针指向的字符串,则需要将自定义比较器作为模板参数传递给映射。或者简单地使用
std::string
作为键类型。

除了@tuple\u cat answer,您还可以将所有字符串常量放在一个位置:

公共常数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";

然后在代码中使用这个常量。铬源中使用的类似方法。但是,如果您试图以某种方式从用户输入或任何其他来源获取密钥,这将不起作用。或者,您可以使用@tuple\u cat answer之外的
std::unordered\u map

将所有字符串常量放在一个位置:

公共常数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

发布一些说明问题的代码。请添加一个。这将更容易帮助你,然后张贴一些代码来说明问题。请添加一个。这将更容易帮助您,这也解释了为什么当指定
/O2
时它会工作,因为这意味着我假设当使用/02编译时,编译器将所有重复字符串映射到相同的内存地址,并且当没有使用优化时,每个字符串都有单独的位置,即使它们是相同的?编辑:请阅读有关字符串池的内容,谢谢各位。这也解释了为什么当指定了
/O2
时它会起作用,因为这意味着我假设当使用/02编译时,编译器会将所有重复的字符串映射到同一内存地址,并且当没有使用优化时,每个字符串都有单独的位置,即使它们是相同的?编辑:请阅读有关字符串池的内容,谢谢各位。