c++ - 在 C++ 中对 unordered_map 使用 getter 会创建大小为 8 的无效读取

标签 c++ c++11 valgrind stdmap

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

相关文章:

c++ - 使用 std::enable_if 的正确方法

c++ - Qt 5 : unable to declare signal that takes rvalue reference

C++0x (C++11) 作为函数式语言?

c - Valgrind 在我的机器上产生错误的输出

c++ - Valgrind 提示内存泄漏,但我正在调用 new 和 delete

c++ - 关于C++ vector 和数组的一些考题

拥有 POSIX 文件描述符的对象的 C++ 复制构造函数

c - c中的内存泄漏错误

c++ - 如何在 emacs lisp 中获取 c/c++ 头系统包含目录?

c++ - 如何修复此警告 : conversion to 'unsigned char' from 'int' may alter its value