49

c++ 中的字符串文字是否在静态内存中创建并仅在程序退出时销毁?

4

4 回答 4

54

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

标准中的 2.13.4/1 说

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

该标准在 3.7.1/1 中提到了“静态存储持续时间”:

这些对象的存储将持续到程序的持续时间。

于 2008-12-08T09:51:53.550 回答
44

实际上,它的创建位置是编译器编写者的实现决定。最有可能的是,字符串文字将存储在内存的只读段中,因为它们永远不会改变。

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

即使您有类似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 |
       +---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+

请记住,我并不是指就 ROM 而言的只读内存,只是专门用于存储不可更改内容的内存(操作系统可能将其标记为真正只读)。

他们也永远不会被摧毁,直到main()退出。

于 2008-12-08T09:51:46.657 回答
3

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

于 2008-12-08T09:51:58.123 回答
-1

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

于 2008-12-08T09:59:06.483 回答