悬空字符串的 C++ 生命周期

问题描述 投票:0回答:5

C
中,你可以写

const char *result = "AB";

C++
标准支持这种风格吗?这个常量字符串的生命周期是否与指针的相同作用域一起得到保证?

c++ pointers standards lifetime
5个回答
1
投票

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

请注意,C 和 C++ 中的文字字符串之间存在语义差异:在 C++ 中,文字字符串存储在 constant 字符的数组中(因此需要

const
中的
const char*
)。在 C 中,它们不是常量数组(所以
char *
在 C 中是可以的)。但是,不允许修改 C 中的文字字符串,这使得它们只读(但不是常量)。


1
投票

引用

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

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

并且,对于静态存储持续时间,第 § 6.7.1 章

所有没有动态存储持续时间、没有线程存储持续时间的变量 不是本地的有静态存储持续时间。 这些实体的存储应在有效期内持续 程序。

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


1
投票

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

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

字符串文字具有静态存储持续时间,因此在程序的生命周期中都存在于内存中。

[lex.string]

6 在第 6 阶段翻译之后,出现一个不以 编码前缀是普通的字符串文字。一根普通的字符串 文字的类型为“n 个 const char 的数组”,其中 n 是数组的大小 字符串如下定义,具有静态存储持续时间([basic.stc]), 并用给定的字符初始化。 15 计算 string-literal

会产生一个字符串文字对象 静态存储持续时间,从给定字符初始化为 上面指定的。 ...

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

0
投票

在 Linux 世界中,字符串文字将放置在 ELF 文件的

.rodata

0
投票

drazen@HP-ProBook-640G1:~/proba$ readelf -x .rodata proba Hex dump of section '.rodata': 0x00002000 01000200 414200 ....AB.

    

© www.soinside.com 2019 - 2024. All rights reserved.