首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ std::字符串使用覆盖值

c++ std::字符串使用覆盖值
EN

Stack Overflow用户
提问于 2022-11-03 16:59:07
回答 1查看 32关注 0票数 -1

我在这里做错什么了?显然,当我打电话给getbbb时,aval被改写了。预期产出如下:

代码语言:javascript
复制
test A aval: "aaa"
test B aval: "aaa"

实际产出如下:

代码语言:javascript
复制
test A aval: "aaa"
test B aval: "bbb"

文件testb.c:

代码语言:javascript
复制
#include <string>

// g++ -o tempa testb.c && ./tempa

std::string getaaa() {
  return std::string("aaa");
}

std::string getbbb() {
  return std::string("bbb");
}

int main(
  int argc,               // num args, including pgm name
  char * argv[])          // args
{
  const char * aval = getaaa().c_str();
  printf("test A aval: \"%s\"\n", aval);

  getbbb();

  printf("test B aval: \"%s\"\n", aval);
  return 0;

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-03 17:01:12

const char * aval = getaaa().c_str();会导致未定义的行为。

getaaa()返回一个临时string对象,该对象在创建该对象的完整表达式完成(即在;上)时被销毁,该表达式是在您抓取了string的数据指针之后销毁的。因此,指针被悬空,指向已释放的内存。对该指针的任何后续读取都是未定义的行为。

由于来自getaaa()getaaa()对象在调用getbbb()之前被销毁并释放其数据,因此允许getbbb()为其自己的string对象重用相同的内存。这是不能保证的,但这是可能的(显然是在你的情况下)。

要解决这个问题,请在获取指针之前将临时string对象从getaaa()保存到本地string变量:

代码语言:javascript
复制
const string sval = getaaa();
const char * aval = sval.c_str();

printf("test A aval: \"%s\"\n", aval);

getbbb();

printf("test B aval: \"%s\"\n", aval);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74306914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档