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