我正在尝试为字段使用 getter 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);
无效的读取消失了。
setter/getter 是标准 setter/getter :
std::unordered_map<std::string, User *> Session::getUserMap() const{
return userMap;
}
如果需要,我可以提供 valgrind 数据,我在 clion 编辑器上使用 c++11。
最佳答案
getUserMap
返回 userMap
的拷贝。这意味着您获得的迭代器只能与所述拷贝一起使用。
因此,当您存储拷贝然后将迭代器与它一起使用时,一切正常。
当您多次调用 getUserMap
时,您会获得 map 的不同 和临时拷贝。您不能使用从第一个拷贝(现在无效,因为它的映射是临时的)获得的迭代器来访问第二个拷贝。当您尝试时,您会得到未定义的行为,这就是您看到令人困惑的错误的原因。
这是按值返回的本质,它总是返回一个新的对象而不是原来的对象。如果你想直接读取 userMap
,那么考虑返回一个 const 引用来代替它:
std::unordered_map<std::string, User *> const& Session::getUserMap() const{
return userMap;
}
关于c++ - 在 C++ 中对 unordered_map 使用 getter 会创建大小为 8 的无效读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59007694/