Рассмотрите этот код:
const char* someFun() {
// ... some stuff
return "Some text!!"
}
int main()
{
{ // Block: A
const char* retStr = someFun();
// use retStr
}
}
В функции someFun()
, где "Some text!!"
сохраненный (я думаю, что это может быть в некоторой статической области ROM), и что его объемом является время жизни?
Будет память, на которую указывают retStr
будьте заняты всюду по программе или быть выпущенными, после того как блок A выходит?
Стандарт C ++ не говорит, где следует хранить строковые литералы. Однако это гарантирует, что их время жизни равно времени жизни программы. Таким образом, ваш код действителен.
«Какой-то текст !!»
не имеет области . Область - это свойство объекта с именем . Точнее, это свойство самого названия. «Немного текста !!»
- это безымянный объект - строковый литерал. У него нет названия, и поэтому любые разговоры о его «масштабах» не имеют никакого смысла. У него нет размаха.
Кажется, вы спрашиваете не о области . Это время жизни или продолжительность хранения «Какой-то текст !!»
. Строковые литералы в C / C ++ имеют статическую продолжительность хранения , что означает, что они живут «вечно», то есть пока выполняется программа. Итак, память, занятая «Какой-то текст !!»
, никогда не освобождается.
Просто имейте в виду (в качестве примечания), что строковые литералы являются неизменяемыми объектами. Записывать в эту память запрещено.
Будет ли указана память 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"
Строка будет храниться статически в специальной (обычно доступной только для чтения в современных ОС) секции бинарного файла программы. Его память не выделяется (отдельно для строки, только для всего раздела при его загрузке в память) и не деаллоцируется.