C++ 函数返回的字符串文本的生存期
考虑以下代码:C++ 函数返回的字符串文本的生存期,c++,c,lifetime,string-literals,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的某个静态区域),它的作用域寿命是多少 retStr指向的内
const char* someFun() {
// ... some stuff
return "Some text!!"
}
int main()
{
{ // Block: A
const char* retStr = someFun();
// use retStr
}
}
在函数someFun()
中,“Some text!!”存储在哪里(我想它可能在ROM的某个静态区域),它的作用域寿命是多少
retStr
指向的内存会在整个程序中被占用还是在块A退出后被释放?字符串将静态存储在程序二进制文件的特殊(在现代操作系统上通常为只读)部分。它的内存没有被分配(单独为字符串,只在加载到内存中的总区段),并且不会被释放。 < P> C++标准没有说明应该存储字符串字。但是,它确实保证他们的生命周期就是程序的生命周期。因此,您的代码是有效的。部分文本!!“没有作用域。范围是命名实体的属性。更准确地说,它是名称本身的属性“Some text!!”
是一个无名对象-字符串文本。它没有名字,因此任何关于其“范围”的讨论都毫无意义。它没有范围
你似乎问的不是范围。它是一些文本的生存期或存储持续时间!!“。C/C++中的字符串文字具有静态存储持续时间,这意味着它们“永远”存在,即只要程序运行。因此,“某些文本!!”
占用的内存永远不会释放
请记住(作为旁注),字符串文字是不可修改的对象。写入那个存储器是非法的
retStr指向的内存会在整个程序中被占用还是在块A退出后被释放
编辑:
它将不发布,但retStr
将不可用。(区块范围)
它将不会被释放,只有符号RETSR将不可用且不正确。retStr在执行后指向的内存是静态内存。它是在应用程序启动时分配的,只有在应用程序终止时才被释放。@all:我错了,我想的是
retStr
。将改变答案。这不一定是真的。如果您链接到的二进制格式不支持“只读节”的概念,该怎么办?(例如,大多数基本COM文件)mamonts也没有只读部分。它们只对历史感兴趣。即使在com文件中,也会有一部分(文件的一部分)或几个用于存储常量。在段或页面描述符中,它们不会被标记为只读,但想法是一样的。这只是一个极端的例子,无法将字符串放入“只读节”(因为没有节)。关键是,这是不可能的,标准没有规定这样的要求,因此,即使有可能,符合要求的编译器/链接器也可能不会这样做。关于COM文件,你绝对错了:COM文件是实模式“内存快照”,甚至连链接器逻辑上放置所有常量的内存区域也不是只读的。Real mode没有任何类似的内存保护功能。你也可以看看这个问题:你能参考(草案)标准吗?
const char *ptr;
{
const char* retStr = "Scope";
ptr = retStr;
}
printf("%s\n", ptr); //prints "Scope"
//printf("%s\n", retStr); //will throw error "retStr undeclared"