下面的代码编译并运行没有错误和预期的输出:
#include <string>
#include <iostream>
using namespace std;
string getString()
{
char s[] = "Hello world!";
return s;
}
int main()
{
cout << getString() << endl;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,这总是有效吗?通常,如果你返回一个在本地声明的C字符串,你可能会遇到一些未定义的行为,但在这种情况下仍然是一个问题,因为它是通过字符串构造函数运行的,并且(可能)被复制到动态内存中?
Fra*_*ank 12
return s;
Run Code Online (Sandbox Code Playgroud)
该行相当于:
return std::string(s);
Run Code Online (Sandbox Code Playgroud)
这将是字符串的副本,所以没关系.
参考: http ://en.cppreference.com/w/cpp/string/basic_string/basic_string(构造函数#5)
构造字符串,其内容使用s指向的以null结尾的字符串的副本进行初始化.
编辑:还有一个细节.你提到
复制到动态内存?
也许答案可能是真的无关紧要.
提供的语义std::string没有对此做出任何规范,它只是保证它可以被复制/移动并以一致的方式访问.如何实现这一点取决于库实现者.
事实上,流行的std::string使用实现称为" S mall S tring O ptimization".在一定长度下的字符串存储在字符串对象本身中的位置.
| 归档时间: |
|
| 查看次数: |
771 次 |
| 最近记录: |