单独初始化的字符串变量是否会内存重叠?C++编译器如何规避该问题
问题1:C++及编译器如何避免字符串字面量重叠
- C++标准明确规定:字符串字面量属于静态存储期对象,每个字面量对应一段独立的、长度固定的内存区域,包含自身所有字符和末尾的终止符
\0,生命周期与程序运行周期一致。编译器不允许将一个字符串字面量的存储区域分配到另一个字符串字面量的内存区间内部。 - 字符串字面量的内存布局是编译、链接阶段就确定的,存储在程序的只读数据段(
.rodata),不存在运行时"新分配字面量占用旧字面量内存"的逻辑。你举例的输出异常场景,只有在你主动触发未定义行为时才会发生:比如通过const_cast去掉指针的const属性后,越界写入字符串字面量的内存,破坏了前一个字面量的终止符\0,正常操作下不会出现该问题。 - 部分编译器的字符串合并优化属于合法行为,不会导致异常:比如两个完全相同的字符串字面量可能指向同一块内存,或者短字面量是长字面量的后缀时,可能复用长字面量的后缀内存,这些情况都不会破坏任意一个字面量的完整性和终止符,也不会出现你描述的输出错误。
问题2:替换为const char[]是否会有同样问题
不会。
- 当你写
const char myString1[] = "string content 1";时,编译器会根据字面量的长度自动确定数组的大小(字符数+1,用于存放终止符\0),并将字符串字面量的内容拷贝到数组的独立内存空间中。如果是局部变量,数组分配在栈上;如果是全局变量,分配在全局数据段。 - 每个
const char[]对象都是独立的内存实体,C++标准要求不同对象的内存地址不能重叠(除非是基类子对象这类特殊情况,字符数组不属于此类),因此完全不会出现内存重叠问题。
内容的提问来源于stack exchange,提问作者Jaxon
相关产品推荐
相关产品推荐

