如何解决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;
}
在这种情况下,字符串内容被破坏。是不是因为return是一个指针,所以返回了指针(地址)的值,但指针所指向的内容却被回收了?
解决方法
content
在Inner
退出时(返回指针之后)立即破坏。因此,Inner
返回的指针从返回的那一刻起就是悬空指针。
您在此处编写的Inner
的第二版也是如此。 content
在Inner
的末尾超出范围,并且Inner
返回一个悬空指针。
因此,在cout
语句完成执行之前,指针就无效了。
此处的功能Outer
基本无关。
也就是说,如果您运行此程序,则可能仍会在cout
语句中打印出期望值,因为悬空指针所指向的内存可能仍包含它以前包含的值。但这并不能保证,特别是优化器可能会意识到,content
的值不可能合法地影响任何事物,并且从不首先对其进行初始化就不会做出响应。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。