我一直想知道,字符串常量在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()一样使用默认字符串值是否安全?
字符串文字具有静态的存储期限,并可以延长程序的寿命。从草案C ++标准节2.14.5
字符串文字段落8它说(重点矿山前进):
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“ n const char的数组”,其中n是如下定义的字符串的大小,并且具有静态存储持续时间(3.7)。
并从“3.7.1
静态存储持续时间”第1节中:
所有没有动态存储持续时间,没有线程存储持续时间以及非本地变量的变量都具有静态存储持续时间。这些实体的存储应在程序的整个过程中持续(3.6.2、3.6.3)。
func3
另一方面,第二种情况无效。引用的临时绑定的生存期在引用的生存期内一直存在,在这种情况下,函数返回时将终止。这部分12.2
内容涵盖:
第二种情况是引用绑定到临时项时。115引用所绑定的临时对象或引用所绑定的子对象的完整对象的临时对象在引用的生存期内一直存在,但以下情况除外:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句