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

sud*_*03r 25 c c++ lifetime string-literals

考虑以下代码:

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

int main()
{
   { // Block: A
      const char* retStr = someFun();
      // use retStr
   }
}
Run Code Online (Sandbox Code Playgroud)

在函数中someFun(),"Some text!!"存储的位置(我认为它可能在ROM的某个静态区域)以及它是什么范围 一生?

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

小智 41

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

  • 您能参考一下标准(草案)吗? (2认同)

AnT*_*AnT 26

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

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

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

  • 纠正它是一生,而不是范围,我的坏:( (2认同)

osg*_*sgx 5

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

  • 这不一定是真的.如果你链接的二进制格式不支持"只读部分"的概念怎么办?(例如最基本的COM文件) (3认同)