c ++中的字符串文字是在静态内存中创建的,只有在程序退出时才会被销毁?
答案 0 :(得分:43)
是的,字符串文字在程序的整个持续时间内都有效,即使在破坏静态对象期间也是如此。
2.13.4 / 1标准中说
普通字符串文字的类型为“n const char数组”和静态存储持续时间。
标准中提到3.7.1 / 1中的“静态存储持续时间”:
这些对象的存储应持续该程序的持续时间。
答案 1 :(得分:39)
创建它的地方是编译器编写者的实现决定。最有可能的是,字符串文字将存储在只读的内存段中,因为它们永远不会改变。
在旧编译器时代,您曾经拥有像这些文字这样的静态数据,以及全局但可变的数据。它们存储在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()
退出之前,它们也永远不会被销毁。
答案 2 :(得分:3)
嗯......是的。他们必须是;构成每个字符串中字符序列的信息必须在某处。如果要动态分配它们然后进行初始化,那么用于初始化的信息将驻留在哪里?因此,简单地将字符串设置为静态更有效,因此一旦程序加载完成后它们始终可用且有效。
答案 3 :(得分:-1)
字符串文字存储在内存的只读段
中