c++11 - 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;
}
在这种情况下,字符串内容被破坏。是不是因为返回的是一个指针,所以返回了指针(地址)的值,但指针指向的内容被回收了?
解决方案
content
Inner
退出时销毁,返回指针后立即销毁。因此,返回的Inner
指针从返回的那一刻起就是一个悬空指针。
Inner
你在这里写 的第二个版本也是如此。content
结束时超出范围Inner
,并Inner
返回一个悬空指针。
cout
因此,在语句完成执行之前很久,指针就无效了。
这里的功能Outer
基本上是无关紧要的。
也就是说,如果你运行这个程序,你可能仍然会在cout
语句中打印出预期的值,因为悬空指针指向的内存可能仍然包含它之前包含的值。但是不能保证这一点,特别是优化器可能会意识到, 的值content
不可能合法地影响任何东西,并通过从不初始化它来响应。
推荐阅读
- docker - 错误 Docker 中没有名为“服务器”的 JAAS 配置部分
- ruby-on-rails - Rails:Rails 如何根据表单提交的输入数据创建参数哈希
- sequelize.js - 如何使用`selectGraphQLResultFromTable` 在后图形解析器中加载 Sequelize 查询的关系?
- arm - STM32F103在KEIL IDE下支持浮点吗
- kentico - 创建自定义同义词列表
- computer-vision - 为我的图像应用多 Otsu 阈值
- pandas - Pandas 适用于 group by 以进行文本连接
- plugins - 将 tt_content 的 TCA 更改为子类型?
- ssl - 套接字 sslerror 握手失败 Python 2.4.3
- php - MAMP 4.2 + CodeIgnter 4.1:无法在 Windows 10 环境下加载 PHP 7.4.1 中的 intl 扩展