【问题标题】:String as function argument: how to work with the memory?字符串作为函数参数:如何使用内存?
【发布时间】:2012-07-18 08:02:59
【问题描述】:
void foo(const char* s) { }
foo("bar");
  1. 内存bar在哪里被释放?
  2. 在函数参数中使用匿名字符串时,最舒适且无内存泄漏的做法是什么? (我知道不应该有魔法字符串,只是好奇。)

【问题讨论】:

标签: c++


【解决方案1】:

在您的示例中,参数是一个字符串文字,它具有静态生命周期,并且永远不会被删除。

【讨论】:

    【解决方案2】:

    “bar”在数据部分中定义,地址将在您拥有它的所有地方替换它。 将使用指向该地址的指针调用 foo 函数。

    【讨论】:

      【解决方案3】:

      bar 的内存是在编译时分配的。因此,它永远不必被释放。

      c++ 二进制文件中有不同的部分。一些示例是文本(存储代码的位置)、堆栈和堆。还有一段只读静态内存。我相信这是存储字符串的地方。

      由于字符串不在堆上,所以不需要释放。

      【讨论】:

      • "bar 的内存是在编译时分配的"。嗯,不完全正确!
      • 没有“C++ 二进制”这样的东西。而且语言标准没有说明如何(或是否)将程序编译为机器代码。
      • 取决于您如何解释“分配”一词。它的空间是在实际的二进制文件中分配的,但是“分配”这个词通常指的是运行时堆分配。
      猜你喜欢
      • 2011-12-11
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多