返回具有C++字符串返回值的函数的本地C字符串

Cly*_*ost 7 c++ string

下面的代码编译并运行没有错误和预期的输出:

#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".在一定长度下的字符串存储在字符串对象本身中的位置.

  • 我认为你是误解,`std :: string`的构造函数复制`s`指向的字符串的内容.`s`仍然是一个字符串,ac字符串,但仍然是一个字符串. (2认同)