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

C++中std::string指针函数内更新的作用域疑问(ESP32)

关于C++中std::string指针传递与本地对象赋值的疑问

问题描述

我拥有一个std::string对象,将其以指针形式传入函数。函数中为了操作方便,把传入的指针解引用为本地std::string对象,更新该本地字符串的值后再赋值给原指针指向的对象。目前代码能正常运行,但我担心是否违反C++规则:是否只是指向了已超出作用域的对象?还是真正更新了main函数中abc字符串的底层值?

我知道localString仅在函数内有效,疑惑修改后的值是否真正被保留,而非只是在内存中残留?此前直接操作指针的语法较难理解,故改用此方式简化结构,但现在产生了困惑。

示例代码

int main() {
  
  std::string abc = R"(This is a string "raw" literal)";
  
  updateStringValue(&abc);

  log_v(abc.c_str());

}

void updateStringValue(std::string *theData) {

  std::string localString = (*theData);

  localString.append("some other value");

  *theData = localString;
}

解答

你的代码完全符合C++规则,没有任何问题,修改后的值是真正保留在main函数的abc里的,绝非内存残留。

拆解整个执行过程:

  • std::string localString = (*theData);:这是一次拷贝构造,把指针指向的main里的abc的内容完整复制到局部对象localString中,两者是完全独立的std::string实例,只是初始内容一致。
  • localString.append("some other value");:修改的是localString自身的内容,和原abc没有关联。
  • *theData = localString;:这是一次赋值操作,把修改后的localString的内容拷贝回指针指向的abc对象。这一步完成后,main里的abc就拥有了更新后的内容。

当函数执行完毕,localString确实会被销毁,但此时它的内容已经成功拷贝给abc,所以完全不会影响abc的值。

如果觉得这种两次拷贝(入参拷贝、赋值拷贝)有性能浪费,推荐更简洁高效的引用传递写法:

void updateStringValue(std::string &theData) {
  theData.append("some other value");
}

调用时直接传updateStringValue(abc);,既不用处理指针语法,也避免了额外的拷贝操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:25:24