C++ 中的字符串文字是否在静态内存中创建并仅在程序退出时销毁?
原文由 yesraaj 发布,翻译遵循 CC BY-SA 4.0 许可协议
是的,字符串文字在程序的整个过程中都有效,即使在静态对象的销毁期间也是如此。
标准中的 2.13.4⁄1 说
普通字符串文字的类型为“n const char 数组”和静态存储持续时间。
该标准在 3.7.1⁄1 中提到了“静态存储持续时间”:
这些对象的存储将持续到程序的持续时间。
原文由 James Hopkin 发布,翻译遵循 CC BY-SA 2.5 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
实际上,它的创建位置是编译器编写者的实现决定。最有可能的是,字符串文字将存储在内存的只读段中,因为它们永远不会改变。
在旧的编译器时代,您曾经拥有像这些文字这样的静态数据,以及全局但可变的数据。这些存储在 TEXT(代码)段和 DATA(初始化数据)段中。
即使您有
char *x = "hello";
之类的代码,hello
字符串本身也存储在只读内存中,而变量x
在堆栈中(或在其他位置)内存,如果它是全局的)。x
被设置为hello
字符串的地址。这允许各种棘手的事情,例如字符串折叠,因此“无效选项”(0x1000)和“有效选项”(0x1002)可以使用相同的内存块,如下所示:请记住,我并不是指就 ROM 而言的只读内存,只是专门用于存储不可更改内容的内存(操作系统可能将其标记为真正只读)。
在
main()
退出之前,它们也不会被销毁。