首页 > 解决方案 > std::stirng 的对象生命周期返回 const char* 作为返回值

问题描述

在 C++11 中:

#include <string>
#include <iostream>

const char*Inner() {
  std::string content;
  content = "const characters are returned.";
  return content.c_str();
}

const char* Outer() {
  return Inner();
}
int main(){
  std::cout << "result " << Outer() <<"\n"; // <- Spot 1
  return 0;
}

我有点理解const char* Return Type中的解释。当堆栈消失时,字符串对象被销毁。但我认为这应该在Spot 1完成执行时发生。之后,Inner堆栈被弹出?但在这种情况下,Spot 1仍在执行但堆栈被破坏。谁能解释堆栈何时被破坏?

另一个与上下文相关的问题是:如果我将函数更改为

const char*Inner() {
  std::string content;
  content = "const characters are returned.";
  const char* ptr = content.c_str()
  return ptr;
}

在这种情况下,字符串内容被破坏。是不是因为返回的是一个指针,所以返回了指针(地址)的值,但指针指向的内容被回收了?

标签: c++11

解决方案


contentInner退出时销毁,返回指针后立即销毁。因此,返回的Inner指针从返回的那一刻起就是一个悬空指针。

Inner你在这里写 的第二个版本也是如此。content结束时超出范围Inner,并Inner返回一个悬空指针。

cout因此,在语句完成执行之前很久,指针就无效了。

这里的功能Outer基本上是无关紧要的。

也就是说,如果你运行这个程序,你可能仍然会在cout语句中打印出预期的值,因为悬空指针指向的内存可能仍然包含它之前包含的值。但是不能保证这一点,特别是优化器可能会意识到, 的值content不可能合法地影响任何东西,并通过从不初始化它来响应。


推荐阅读