字符串字面寿命由函数返回字符串字面寿命由函数返回(Lifetime of a string lite

2019-05-12 04:11发布

考虑以下代码:

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

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

在功能someFun()这里是"Some text!!" 存储(我认为这可能是在ROM中的一些静态区),什么是它的 范围 一生?

将指向的内存retStr整个程序占用,或者一旦块A出口被释放?

Answer 1:

C ++标准不说在哪里字符串文字应存放。 但它确实保证他们的一生是程序的生命周期。 您的代码,因此有效。



Answer 2:

"Some text!!" 没有一个范围适用范围是一个命名实体的性质。 更确切地说,它是这个名字本身的属性。 "Some text!!" 一种莫名的对象-一个字符串。 它没有名字,因此关于它的“范围”的任何讨论毫无任何意义。 它没有范围。

你似乎在问什么是不是范围 。 它是终身存储时间 "Some text!!" 。 在C / C ++字符串字面量具有静态存储持续时间 ,这意味着他们居住的“永远”,即只要程序运行。 因此,内存占用"Some text!!" 永远不会释放。

只要记住(作为一个侧面说明),其字符串文字都是非modifyable对象。 它是非法写入内存。



Answer 3:

字符串是静态存储在程序二进制的特殊(通常是只读的现代OS)部分。 (虽然它加载到内存单独的字符串,只为总节),并不会被释放它的内存不分配。



Answer 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"


文章来源: Lifetime of a string literal returned by a function