Время жизни строкового литерала возвращается функцией

Рассмотрите этот код:

const char* someFun() {
    // ... some stuff
    return "Some text!!"
}

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}

В функции someFun(), где "Some text!!" сохраненный (я думаю, что это может быть в некоторой статической области ROM), и что его объемом является время жизни?

Будет память, на которую указывают retStr будьте заняты всюду по программе или быть выпущенными, после того как блок A выходит?

25
задан johnchen902 4 July 2016 в 13:04
поделиться

4 ответа

Стандарт C ++ не говорит, где следует хранить строковые литералы. Однако это гарантирует, что их время жизни равно времени жизни программы. Таким образом, ваш код действителен.

41
ответ дан 28 November 2019 в 18:09
поделиться

«Какой-то текст !!» не имеет области . Область - это свойство объекта с именем . Точнее, это свойство самого названия. «Немного текста !!» - это безымянный объект - строковый литерал. У него нет названия, и поэтому любые разговоры о его «масштабах» не имеют никакого смысла. У него нет размаха.

Кажется, вы спрашиваете не о области . Это время жизни или продолжительность хранения «Какой-то текст !!» . Строковые литералы в C / C ++ имеют статическую продолжительность хранения , что означает, что они живут «вечно», то есть пока выполняется программа. Итак, память, занятая «Какой-то текст !!» , никогда не освобождается.

Просто имейте в виду (в качестве примечания), что строковые литералы являются неизменяемыми объектами. Записывать в эту память запрещено.

26
ответ дан 28 November 2019 в 18:09
поделиться

Будет ли указана память retStr будет занят на протяжении всей программы или будет освобожден после выхода из блока A?

Edit:

Он будет не освобожден, но retStr не будет доступен. (объем блока)

const char *ptr;
{   
   const char* retStr = "Scope";
   ptr = retStr;
}   

printf("%s\n", ptr); //prints "Scope"

//printf("%s\n", retStr); //will throw error "retStr undeclared"
-2
ответ дан 28 November 2019 в 18:09
поделиться

Строка будет храниться статически в специальной (обычно доступной только для чтения в современных ОС) секции бинарного файла программы. Его память не выделяется (отдельно для строки, только для всего раздела при его загрузке в память) и не деаллоцируется.

5
ответ дан 28 November 2019 в 18:09
поделиться