Время жизни строкового литерала, возвращаемого функцией - PullRequest
25 голосов
/ 05 апреля 2010

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

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

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

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

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

Ответы [ 4 ]

40 голосов
/ 05 апреля 2010

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

26 голосов
/ 05 апреля 2010

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

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

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

5 голосов
/ 05 апреля 2010

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

0 голосов
/ 05 апреля 2010

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