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

时间:2017-08-01 17:20:10

标签: c++ string

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

#include <string>
#include <iostream>
using namespace std;

string getString()
{
    char s[] = "Hello world!";
    return s;
}

int main()
{
    cout << getString() << endl;
}

我的问题是,这总是有效吗?通常,如果你返回一个在本地声明的C字符串,你可能会遇到一些未定义的行为,但在这种情况下仍然是一个问题,因为它是通过字符串构造函数运行的,并且(可能)被复制到动态内存中?

1 个答案:

答案 0 :(得分:12)

 return s;

该行相当于:

return std::string(s);

这会产生字符串的副本,所以没关系。

参考: http://en.cppreference.com/w/cpp/string/basic_string/basic_string(构造函数#5)

  

构造字符串,其内容使用s指向的以null结尾的字符串的副本进行初始化。

修改:还有一个细节。你提到

  

复制到动态内存中?

答案可能也许是,它并不重要。

std::string提供的语义没有对此做出任何说明,它只是保证可以复制/移动它并以一致的方式访问它。如何实现这一点取决于库实现者。

事实上,std::string的热门实施使用了一种名为&#34; S 商城 S tring O 优化&# 34 ;.其中一定长度的字符串存储在字符串对象本身中。