Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

В "Some text!!" нет области действия. Область действия - это свойство именованного объекта. Точнее, это свойство самого имени. "Some text!!" - это безымянный объект - строковый литерал. У него нет имени, и поэтому любые обсуждения его "сферы" не имеют никакого смысла. Он не имеет границ.

То, о чем вы, кажется, спрашиваете, не является областью. Это срок службы или время хранения "Some text!!". Строковые литералы в C/С++ имеют статическую продолжительность хранения, что означает, что они живут "навсегда", то есть до тех пор, пока программа работает. Таким образом, память, занятая "Some text!!", никогда не выпускается.

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

Ответ 3

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

Ответ 4

Будет ли память, указанная 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"