请看下图。更改p1的值后,现在它指向B2内存位置。阴影内存段发生了什么变化?据我所知,它将一直存在,直到代码块完成执行。那些有缺陷的内存段是否可以再次重用于程序执行?
char *p1 = "String";
char *p2 = "Another";
p1 = p2;
答案 0 :(得分:6)
阴影内存段发生了什么变化?据我所知,它将一直存在,直到代码块完成执行。
根据§2.13.5/ 8,字符串文字具有静态存储持续时间:
普通字符串文字和UTF-8字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char数组”,其中n是下面定义的字符串大小,并且具有静态存储持续时间(3.7)。
这意味着,根据§3.7.1/ 1,它们在程序的持续时间内持续:
所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间。这些实体的存储应持续到程序的持续时间(3.6.2,3.6.3)。
作为旁注,您应该将字符串文字分配给char const*
或char const[]
,而不是char*
。它主要在编译器中工作的原因是出于向后兼容性的原因,在C ++ 11中它已被弃用。
那些有缺陷的内存段是否可以再次重用于程序执行?
根据§2.13.5/ 16,未指明它们是否被重复使用:
评估字符串文字会产生具有静态存储持续时间的字符串文字对象,从上面指定的给定字符初始化。是否所有字符串文字都是不同的(即,存储在非重叠对象中)以及是否对字符串文字的连续评估产生相同或不同的对象是未指定的。 [注意:尝试修改字符串文字的效果未定义。 - 结束说明]
答案 1 :(得分:0)
在程序执行期间,不需要再次使用该特定存储器段。这些部分留在记忆中,直到程序的生命结束。即使在某些时候,你重新编写命令:
p1 = "String";
并不意味着p1
将指向该特定内存段。它可能,但可能没有。
答案 2 :(得分:0)
只要没有被系统清除,它就会一直悬在内存中。 "悬空"因为没有指向该字符串的指针。