【问题标题】:Is the memory of a (character) array freed by going out of scope?超出范围是否释放了(字符)数组的内存?
【发布时间】:2010-11-23 01:01:21
【问题描述】:

my previous question 非常相关,但我发现这是一个单独的问题,无法找到可靠的答案。

(字符)数组使用的内存是否因超出范围而被释放?

一个例子:

void method1()
{
  char str[10];
  // manipulate str
}

那么在method1调用之后,str(10字节)使用的内存是被释放了,还是我也需要显式调用free呢?

我的直觉告诉我这只是一个简单的原始类型数组,所以它会自动释放。我很怀疑,因为在 C 中你不能假设任何东西都会被自动释放。

【问题讨论】:

    标签: c arrays memory


    【解决方案1】:

    在这种情况下,您不需要免费拨打电话。值“str”是一个基于堆栈的值,当该特定方法/范围退出时将被清除。

    您只需对通过 malloc 显式创建的值调用 free。

    【讨论】:

    • (“no”的意思是——是的,它是通过超出范围而释放的,不,你不需要显式调用 free)
    • @jmanning2k 我也重新阅读了我的帖子并对其进行了编辑以更清楚地了解“不”的含义
    【解决方案2】:

    它会自动释放。如果你没有 malloc 它,你 不需要释放它。但这与它无关 一个“简单的原始类型数组”——如果它是,它将被释放 结构数组。它被释放是因为它是一个局部变量。

    鉴于您要问这些非常基本的问题, 我不得不问你使用的是哪本 C 教科书。就个人而言,我不相信你可以在没有的情况下有效地学习 C 阅读 Kernighan & Ritchie 的 The C Programming Language,其中 非常清楚地解释了所有这些内容。

    【讨论】:

    • 我实际上读过(并研究过)K&R 的 C 编程语言,但那是在不久前,在我自己真正“深入”C 之前。
    【解决方案3】:

    是的,它被“释放”了。 (不过,不是 free()'ed。)

    由于 str 是一个自动变量,它只会持续到它的作用域,也就是直到函数块的末尾。

    注意你只 free() 你 malloc() 的东西。

    【讨论】:

      【解决方案4】:

      是的,一旦method1 返回,内存就会自动释放。 str 的内存在堆栈上分配,并在清理方法的堆栈帧后释放。将此与您必须显式释放的堆上分配的内存(通过malloc)进行比较。

      【讨论】:

        【解决方案5】:

        不,这种局部变量是在堆栈上分配的,因此当您从过程返回时,内存可用于下一个函数调用,该函数调用会将内存用于其堆栈帧。

        如果您使用malloc(),则空间分配在堆上,必须显式释放。

        【讨论】:

          【解决方案6】:

          我认为它被释放不是因为它是原始变量,而是因为它是一个局部变量,它将被分配在堆栈而不是堆上。如果您不 malloc 它,那么据我所知,您将无法释放它。

          【讨论】:

            【解决方案7】:

            我最近对 ​​C/C++ 有点生疏了,但我认为你是对的。只要您没有动态分配该内存,就应该没问题。

            【讨论】:

              【解决方案8】:

              是的,它在超出范围时被“释放”。
              不,您不必显式释放它。

              char 数组是在堆栈上分配的,因此当您从函数返回时,该堆栈空间是可重用的。您不需要显式释放内存。

              好的经验法则:如果你malloc,你必须free

              【讨论】:

              • 问题是关于 C,而不是 C++
              • 啊,是的,确实。让我解决这个问题。
              猜你喜欢
              • 2020-11-10
              • 1970-01-01
              • 1970-01-01
              • 2018-10-05
              • 2010-11-22
              • 2010-10-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多