悬挂字符串的C ++生存期

时间:2019-06-03 06:50:36

标签: c++ pointers standards lifetime

C中,您可以写

const char *result = "AB";

C++是否标准支持这种样式?可以保证该常量字符串的生命周期与指针的作用域相同吗?

4 个答案:

答案 0 :(得分:1)

文字字符串常量在整个程序中都有生命周期,并且字符串存储在其中的数组永远不会超出范围。

请注意,C和C ++中的文字字符串在语义上有所不同:在C ++中,文字字符串存储在恒定字符数组中(因此const中的const char*是需要)。在C语言中它们不是常量数组(因此char *在C语言中还可以)。但是,不允许在C中修改文字字符串,这会使它们只读(但不是常量)。

答案 1 :(得分:1)

  

这个常量字符串的生命周期和指针的作用域是否得到保证?

不,字符串文字的生存期与指向它们的指针的生存期无关。 String literals存在于程序的整个生命周期中。

  

字符串文字具有static storage duration,因此在程序生命周期内存在内存中。

[lex.string]

  

6翻译阶段6之后,一个string-literal开头不是   编码前缀是普通的字符串文字。一个普通的弦   文字的类型为“ n const char数组”,其中n是   如下定义的字符串,具有静态存储期限([basic.stc]),   并使用给定的字符进行初始化。

     

15评估string-literal会导致字符串文字对象具有   静态存储期限,从给定字符初始化为   以上指定。 ...

答案 2 :(得分:1)

引用C++17,第5.13.5章(强调我的

  

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。一个箭头   字符串文字的类型为“ n const char数组”,其中n是下面定义的字符串的大小,,并且具有   静态存储期限

,在静态存储期间,请参见第6.7.1节

  

所有没有动态存储持续时间,没有线程存储持续时间并且是   非本地具有静态存储期限。 这些实体的存储期限为   程序。

因此,字符串文字的生命周期是程序的整个执行过程,永远不会超出范围。

答案 3 :(得分:0)

字符串常量(文字)与整个程序具有相同的生存期。从指针创建之前到销毁之后很长