C++类中std::map类型成员指针的解引用方法,含嵌套map场景
C++ map指针解引用问题解答
问题根因
你遇到的运行错误核心是C++运算符优先级问题:后缀运算符[]的优先级高于前缀解引用运算符*,你的原有写法*test->myMaps[1]的实际执行逻辑是完全错误的:
- 先取
test->myMaps拿到map指针 - 错误把该指针当做数组首地址,取下标为1的元素(你只分配了1个map对象,这一步已经是非法内存访问)
- 对非法地址做解引用,直接触发运行异常。
普通map指针的正确解引用写法
你需要用括号强制改变运算顺序,先解引用map指针得到map对象,再调用operator[]访问元素:
// 写法1:最常用的括号显式指定优先级,可读性更高 std::cout << (*(test->myMaps))[1] << std::endl; // 写法2:显式调用operator[]成员函数,逻辑完全等价 std::cout << test->myMaps->operator[](1) << std::endl;
修正后的完整可运行代码:
#include <iostream> #include <map> class MyClass { public: std::map<int,int> *myMaps; }; // 注意你原来的类定义末尾漏了分号,这是新手常见的编译错误点 int main() { MyClass *test = new MyClass(); std::map<int,int> *testMap = new std::map<int,int>(); (*testMap)[1] = 1; test->myMaps = testMap; // 正确解引用 std::cout << (*(test->myMaps))[1] << std::endl; // 记得释放内存避免泄漏,实际开发更推荐用智能指针替代裸指针 delete testMap; delete test; return 0; }
嵌套map指针的解引用写法
首先注意你给出的类定义有笔误:内层容器是std::map不是std::maps,修正后的类定义:
class MyClass { public: std::map<int, std::map<int,int>> *myMaps; };
如果要访问外层key为outer_key、内层key为inner_key对应的元素,只需要在解引用外层map指针后,连续调用两次operator[]即可:
// 示例赋值 (*(test->myMaps))[1][2] = 100; // 示例读取 std::cout << (*(test->myMaps))[1][2] << std::endl;
额外注意点
- 若不确定key是否存在,不要直接用
operator[],它会自动为不存在的key插入默认值,建议先用find()判断存在性再取值 - 实际开发中不推荐手动管理裸指针,可改用
std::unique_ptr或std::shared_ptr避免内存泄漏、野指针等问题
内容的提问来源于stack exchange,提问作者FriedRice
相关产品推荐
相关产品推荐

