我一直在想,C ++中的字符串常量有多长。例如,如果我在函数内部创建了一些const char * str =“something”,那么返回str的值是否安全?
我写了一个示例程序,看到这样的返回值仍然存储了该字符串,我感到非常惊讶。这是代码:
#include <iostream>
using namespace std;
const char *func1()
{
const char *c = "I am a string too";
return c;
}
void func2(const char *c = "I'm a default string")
{
cout << c << endl;
}
const int *func3()
{
const int &b = 10;
return &b;
}
int main()
{
const char *c = "I'm a string";
cout << c << endl;
cout << func1() << endl;
func2();
func2("I'm not a default string");
cout << *func3() << endl;
return 0;
}
它给了我以下输出:
我是一个字符串
我也是一个字符串
我是默认字符串
我不是默认字符串
10
func3只是为了找出它是否适用于其他类型 所以问题是:是否可以安全地返回指向该函数内创建的字符串常量的指针(如func1())? 另外,使用func2()中的默认字符串值是否安全?
答案 0 :(得分:10)
字符串文字具有静态存储持续时间并且持续程序的生命周期。来自draft C++ standard部分2.14.5
字符串文字段落 8 表示(强调我的前进):
也引用普通的字符串文字和UTF-8字符串文字 作为窄字符串文字。窄字符串文字的类型为“数组” of n const char“,其中n是下面定义的字符串的大小, 并且具有静态存储持续时间(3.7)。
以及3.7.1
静态存储时间段 1 :
没有动态存储持续时间的所有变量都没有 线程存储持续时间,并不是本地有静态存储 持续时间。 这些实体的存储应持续一段时间 该计划(3.6.2,3.6.3)。
另一方面,func3
中的第二个案例无效。临时绑定到引用的生命周期在引用的生命周期中持续存在,在这种情况下,在函数返回时结束。这一点在12.2
部分中有所说明:
第二个上下文是指引用绑定到临时引用。 115 临时引用的临时或临时的 子对象的完整对象到绑定引用的 除:
外,在参考文件的生命周期内仍然存在