指针的内存使用情况

Dea*_*ock 8 c++ memory pointers

请看下面的图片.更改p1的值后,现在它指向B2内存位置.阴影内存段发生了什么变化?据我所知,它将一直存在,直到代码块完成执行.那些有缺陷的内存段是否可以再次重用于程序执行?

char *p1 = "String";
char *p2 = "Another";
p1 = p2;
Run Code Online (Sandbox Code Playgroud)

问题标题可能会产生误导.我无法找到这个问题的标题. 在此输入图像描述

Sho*_*hoe 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,未指明它们是否被重用:

评估字符串文字会产生具有静态存储持续时间的字符串文字对象,从上面指定的给定字符初始化.是否所有字符串文字都是不同的(即,存储在非重叠对象中)以及是否对字符串文字的连续评估产生相同或不同的对象是未指定的.[注意:尝试修改字符串文字的效果未定义. - 结束说明]