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

从C转C++后通过指针修改map元素值不生效问题求助

问题根本原因

你遇到的是C/C++的值传递规则问题,指针本身作为参数传递时默认也是值传递:

  • 调用addValues(bla.at("test1"))时,是把map里存储的NULL指针复制了一份传给形参val
  • 函数内部给val赋值new test(),修改的只是这个临时的副本指针,原map里存储的指针还是NULL,没有被改动
  • 后续调用printVal时传入的还是map里的NULL指针,运行会直接触发空指针访问崩溃

修复方案

方案1:修改函数参数为指针的引用

让形参直接绑定实参本身,而非复制副本,修改形参就会直接改动map里存储的指针:

// 加&表示指针的引用
void addValues(test*& val){
    if  (val == NULL){
        val = new test();
        cout<<"new";
    }
    val->i = 10;
    val->j = 12;
}

方案2:返回新指针赋值给map元素

test* addValues(test* val){
    if  (val == NULL){
        val = new test();
        cout<<"new";
    }
    val->i = 10;
    val->j = 12;
    return val;
}
// 调用时赋值回map
bla["test1"] = addValues(bla.at("test1"));

额外注意事项

  • 当前写法存在内存泄漏,new出来的结构体没有对应的delete释放,实际项目中建议优先用智能指针std::unique_ptr<test>代替裸指针存储到map,自动管理内存无需手动释放
  • 如果不需要动态分配内存,直接把map的value类型设为test结构体本身而非指针,也能避免这类指针传参问题,代码更简洁安全

内容的提问来源于stack exchange,提问作者MaxPower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:54:05