函数返回的字符串文字的生命周期

时间:2010-04-05 17:32:32

标签: c++ c lifetime string-literals

考虑以下代码:

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

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

在函数someFun()中,"Some text!!"存储在哪里(我认为它可能位于ROM的某个静态区域),它的 scope 生命周期是什么?

retStr指向的内存是否会在整个程序中被占用,或者在A块退出后被释放?

4 个答案:

答案 0 :(得分:40)

C ++标准没有说明应该存储字符串文字的位置。但它确实保证了它们的生命周期是程序的生命周期。因此,您的代码有效。

答案 1 :(得分:26)

"Some text!!"没有范围范围名为实体的属性。更确切地说,它是名称本身的属性。 "Some text!!"无名对象 - 字符串文字。它没有名称,因此任何有关其“范围”的讨论都没有任何意义。它没有范围。

您似乎要问的不是范围"Some text!!"生存期存储时间。 C / C ++中的字符串文字具有静态存储持续时间,这意味着它们“永远”存在,即只要程序运行。因此,"Some text!!"占用的内存永远不会被释放。

请记住(作为旁注)字符串文字是不可修改的对象。写入该内存是违法的。

答案 2 :(得分:5)

字符串将静态存储在程序二进制文件的特殊(通常是只读的现代操作系统)部分。它的内存没有分配(单独用于字符串,只有在将内容加载到内存时才能分配整个部分)并且不会被释放。

答案 3 :(得分:-1)

  

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"