Является ли строковый литерал в С++, созданным в статической памяти, и уничтожается только при выходе из программы?
Является строковым литералом в С++, созданным в статической памяти?
Ответ 1
Там, где он был создан, это решение для разработчиков компилятора. Скорее всего, строковые литералы будут храниться в сегментах памяти только для чтения, так как они никогда не меняются.
В старые дни компилятора у вас были такие статические данные, как эти литералы и глобальные, но сменные данные. Они были сохранены в сегменте 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 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+----+
Имейте в виду, что я не имею в виду память только для чтения в терминах ПЗУ, а только память, предназначенную для хранения неизменяемых материалов (которые могут быть отмечены только для чтения ОС).
Они также не уничтожаются до выхода main()
.
Ответ 2
Да, строковые литералы действительны для всей продолжительности программы, даже при уничтожении статических объектов.
2.13.4/1 в Стандарте говорится
Обычный строковый литерал имеет тип "array of n const char" и статический срок хранения.
В стандарте говорится о "статической продолжительности хранения" в 3.7.1/1:
Хранение данных объектов должно длиться в течение всего времени программы.
Ответ 3
Ну... Да. Они должны быть такими; информация, которая составляет последовательность символов в каждой строке, должна быть где-то. Если они должны быть распределены динамически, а затем инициализированы, где будет использоваться информация, используемая для инициализации? Таким образом, более эффективно просто сделать строки статичными, чтобы они всегда были доступны и действительны после завершения загрузки программы.
Ответ 4
Строковые литералы хранятся в сегментах памяти только для чтения