字符串常量在c ++中存在多长时间?

时间:2014-07-15 13:49:58

标签: c++ pointers constants string-literals object-lifetime

我一直在想,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()中的默认字符串值是否安全?

1 个答案:

答案 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   临时引用的临时或临时的   子对象的完整对象到绑定引用的   除

外,在参考文件的生命周期内仍然存在