C++ c++;分配/取消分配字符串文本

C++ c++;分配/取消分配字符串文本,c++,memory-management,C++,Memory Management,在本例中,在程序的生命周期内,字符串文字“hello”是何时分配和解除分配的 init(char **s) { *s = "hello"; } int f() { char *s = 0; init(&s); printf("%s\n", s); return 0; } 它们不会被分配,而是存储在可执行文件的数据段中。编译器将字符串文本初始化为只读内存段。运行时不进行初始化或删除。假设存在操作系统,则在操作系统加载可执行文件时分配包含字符串文字的内存,在操作系统卸

在本例中,在程序的生命周期内,字符串文字“hello”是何时分配和解除分配的

init(char **s)
{ 
  *s = "hello";
}
int f()
{
  char *s = 0;
  init(&s);
  printf("%s\n", s);
  return 0;
}

它们不会被分配,而是存储在可执行文件的数据段中。

编译器将字符串文本初始化为只读内存段。运行时不进行初始化或删除。

假设存在操作系统,则在操作系统加载可执行文件时分配包含字符串文字的内存,在操作系统卸载可执行文件时释放该内存。具体何时发生这种情况取决于可执行文件的类型(程序、共享库等)和操作系统。

将代码缩进四个空格。不要使用
标签。如何在文章中包含代码段而不使用代码标签?请举例编辑你的帖子。您将看到我所做的修改。基本上,代码只是以空行进行,并用四个空格缩进。编译器可能会将字符串文本的内容复制到本地存储(堆栈)中,因此会进行一些初始化。为了防止这种情况,我将变量声明为
const static char text[]=“hello”。此外,只读段也可能是可执行段。字符串文字可能位于只读内存中,但这取决于编译器。因此,修改字符串文字(如问题中的代码)具有未定义的行为,但可能会起作用。@Thomas。我不知道;我不相信任何编译器会将字符串复制到堆栈上,这对我来说似乎是一个冗余操作。@Thams,@David:是的,编译器可能会选择不使用只读段(如实现细节所述)。但是从程序员的角度来看,你应该总是把它看作是只读的,因为它实际上是“char const *”,并且只被转换成“char *”,用C++来进行向后兼容性,并且注意到任何修改都是未定义的。该规范规定字符串文字是常量,但将其存储区域留给转换器。