我正在尝试对字段std::unordered_map<std::string, User *> userMap
使用吸气剂在其中查找用户。
我累了:
std::unordered_map<std::string, User *>::const_iterator found = getUserMap().find(userName);
但是valgrind检测到大小为8的无效读取。
但是,当我这样做时:
std::unordered_map<std::string, User *> tmpUserMap = getUserMap();
std::unordered_map<std::string, User *>::const_iterator found = tmpUserMap.find(userName);
无效的读取消失了。
吸气剂是标准吸气剂:
std::unordered_map<std::string, User *> Session::getUserMap() const{
return userMap;
}
如果需要,我可以提供valgrind数据,我在clion编辑器上使用c ++ 11。
最佳答案
getUserMap
返回userMap
的副本。这意味着您获得的迭代器只能与所述副本一起使用。
因此,当您存储副本并在其中使用迭代器时,一切正常。
当您多次调用getUserMap
时,您将获得地图的其他临时副本。您不能使用从第一个副本获得的迭代器(由于它的映射是临时的,现在是无效的)来访问第二个副本。尝试时会出现未定义的行为,这就是您看到令人困惑的错误的原因。
这是按值返回的本质,它总是返回一个新对象而不是原始对象。如果您希望直接阅读userMap
,请考虑改为返回一个const引用:
std::unordered_map<std::string, User *> const& Session::getUserMap() const{
return userMap;
}
关于c++ - 在C++中将getter用于unordered_map会导致大小为8的无效读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59007694/