【问题标题】:when does c++ allocate/deallocate string literalsc++ 何时分配/解除分配字符串文字
【发布时间】:2010-12-30 13:57:21
【问题描述】:

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

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

【问题讨论】:

  • 代码缩进四个空格。不要使用 标签。
  • 如何在不使用代码标签的情况下在帖子中包含代码段?请举个例子
  • 编辑您的帖子。你会看到我所做的修改。基本上代码只是以空行开头并缩进四个空格。

标签: c++ memory-management


【解决方案1】:

它们没有被分配,而是存储在可执行文件的 DATA 段中。

【讨论】:

  • 仅供参考,C 和 C++ 语言不需要 DATA 段。规范声明字符串文字是常量,但将它们的存储区域留给翻译器。
【解决方案2】:

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

【讨论】:

  • 编译器可能会将字符串文字的内容复制到本地存储(堆栈)中,因此会有一些初始化。为了防止这种情况,我将变量声明为const static char text[] = "hello";。另外,只读段也可以是可执行段。
  • 字符串文字可能在只读内存中,但这取决于编译器。因此,修改字符串文字,就像问题中的代码一样,具有未定义的行为,但它可能会起作用。
  • @Thomas。我不相信任何编译器会将字符串复制到堆栈上,这对我来说似乎是一个多余的操作。
  • @Thams,@David:是的,编译器可以选择不使用只读段(如实现细节所述)。但是从程序员的角度来看,您应该始终将其视为只读类型,因为该类型实际上是“char const*”,并且仅转换为“char*”以与 C 向后兼容,并且如前所述,任何修改都是未定义的行为。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2015-09-15
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多