我正在尝试对字段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/

10-11 22:28
查看更多