Является строковым литералом в С++, созданным в статической памяти?

Является ли строковый литерал в С++, созданным в статической памяти, и уничтожается только при выходе из программы?

Ответ 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

Строковые литералы хранятся в сегментах памяти только для чтения