从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
相关产品推荐
相关产品推荐

