是С中的字符串文字++;在静态内存中创建? 是C++中的字符串文字,在静态内存中创建,只有在程序退出时被销毁,

是С中的字符串文字++;在静态内存中创建? 是C++中的字符串文字,在静态内存中创建,只有在程序退出时被销毁,,c++,string,char,C++,String,Char,它创建的地方是编译器编写者的一个实现决定,真的。最有可能的是,字符串文字将存储在内存的只读段中,因为它们永远不会更改 在旧的编译器时代,您曾经拥有像这些文本这样的静态数据,以及全局但可更改的数据。这些数据存储在文本(代码)段和数据(初始化数据)段中 即使你有像char*x=“hello”这样的代码,则hello字符串本身存储在只读内存中,而变量x位于堆栈上(如果是全局变量,则存储在可写内存的其他位置)x只是设置为hello字符串的地址。这允许进行各种棘手的操作,如字符串折叠,以便“无效选项”(0

它创建的地方是编译器编写者的一个实现决定,真的。最有可能的是,字符串文字将存储在内存的只读段中,因为它们永远不会更改

在旧的编译器时代,您曾经拥有像这些文本这样的静态数据,以及全局但可更改的数据。这些数据存储在文本(代码)段和数据(初始化数据)段中

即使你有像
char*x=“hello”这样的代码
,则
hello
字符串本身存储在只读内存中,而变量
x
位于堆栈上(如果是全局变量,则存储在可写内存的其他位置)
x
只是设置为
hello
字符串的地址。这允许进行各种棘手的操作,如字符串折叠,以便“无效选项”(0x1000)和“有效选项”(0x1002)可以使用相同的内存块,如下所示:

+-> plus:0   1   2   3   4   5   6   7   8   9   A   B   C   D   E
|      +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
0x1000 | i | n | v | a | l | i | d |   | o | p | t | i | o | n | \0 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
请记住,我指的不是只读存储器,而是专门用来存储不可更改内容的存储器(操作系统可能会将其标记为只读)


在退出
main()
之前,它们也不会被销毁。

是的,字符串文本在整个程序期间都是有效的,即使在销毁静态对象的过程中也是如此

本标准中的2.13.4/1表示

普通字符串文字具有“n const char数组”类型和静态存储持续时间

标准3.7.1/1中规定了“静态存储时间”:

这些对象的存储应在项目期间持续


嗯。。。对他们一定是这样的;组成每个字符串中字符序列的信息必须在某个地方。如果要动态分配它们,然后进行初始化,那么用于初始化的信息将驻留在哪里?因此,更有效的方法是简单地将字符串设置为静态,以便在程序加载完成后,字符串始终可用且有效。

字符串文本存储在内存的只读段中

BSS段仅保存过零但非常量的数据;初始化为非零值的数据在数据段中。@析构函数,我假设这是对JamesHopkin答案的注释。这就是“字符串文字在程序的整个过程中都是有效的,即使在销毁静态对象的过程中也是如此”的答案。无论是我的答案还是“放松”(你在评论中提到的另一个)的答案都没有反驳这一点,但至少你有詹姆斯在身边:-)可能,但不是必需的。一致性实现可以将字符串文本存储在读写内存中。任何能够分辨差异的程序都有未定义的行为。当然,将它们存储在只读内存中是个好主意(如果底层系统支持的话)。