You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类中std::map类型成员指针的解引用方法,含嵌套map场景

C++ map指针解引用问题解答

问题根因

你遇到的运行错误核心是C++运算符优先级问题:后缀运算符[]的优先级高于前缀解引用运算符*,你的原有写法*test->myMaps[1]的实际执行逻辑是完全错误的:

  1. 先取test->myMaps拿到map指针
  2. 错误把该指针当做数组首地址,取下标为1的元素(你只分配了1个map对象,这一步已经是非法内存访问)
  3. 对非法地址做解引用,直接触发运行异常。

普通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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:36:02