C ++ время жизни висящей строки - PullRequest
3 голосов
/ 03 июня 2019

В C вы можете написать

const char *result = "AB";

Этот стиль поддерживается в C++ стандартом?Гарантируется ли время жизни этой константной строки вместе с той же областью действия указателя?

Ответы [ 4 ]

1 голос
/ 03 июня 2019

Цитата C++17, глава § 5.13.5 ( Акцент шахты )

Обычные строковые литералы и строковые литералы UTF-8 также упоминаются как узкие строковые литералы. Стрелка строковый литерал имеет тип «массив из n const char», где n - размер строки, как определено ниже, и имеет статическая продолжительность хранения

и, для статического хранения, глава § 6.7.1

Все переменные, которые не имеют динамической длительности хранения, не имеют длительности хранения потока, и являются не локальные имеют статическую продолжительность хранения. Хранение для этих объектов должно продолжаться в течение программа.

Таким образом, время жизни строковых литералов - это полное выполнение программы, оно никогда не выходит за рамки.

1 голос
/ 03 июня 2019

Гарантируется ли время жизни этой константной строки вместе с той же областью действия указателя?

Нет, время жизни строковых литералов не имеет ничего общего с временем жизни указателейуказывая на них; Строковые литералы существуют во всей жизни программы.

Строковые литералы имеют статическая длительность хранения и, таким образом, существуют в памяти на протяжении всей жизни программы.

[lex.string]

6 После фазы перевода 6 a string-literal , который не начинается с префикса кодирования, является обычным строковым литералом.Обычный строковый литерал имеет тип «массив из n const char», где n - это размер строки, как определено ниже, имеет статическую продолжительность хранения ( [basic.stc] ) и инициализируется с заданными символами..

15 Оценка string-literal приводит к строковому литеральному объекту со статической длительностью хранения, инициализированному из заданных символов, как указано выше....

1 голос
/ 03 июня 2019

Строковые константы литералов имеют время жизни всей программы, и массивы, в которых хранятся строки, никогда не выходят за рамки.

Обратите внимание, что между литеральными строками в C и C ++ есть семантическая разница: в C ++буквенные строки хранятся в массивах констант символов (поэтому необходимо const в const char*).В C они не являются константными массивами (поэтому char * в порядке в C).Однако нельзя изменять буквенную строку в C, что делает их только для чтения (но не постоянными).

0 голосов
/ 03 июня 2019

Строковая константа (литерал) имеет то же время жизни, что и вся программа.От пути до создания указателя и после его уничтожения

...