超出范围会释放(字符)数组的内存吗?

时间:2009-08-26 14:44:22

标签: c arrays memory

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

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

一个例子:

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

所以在method1调用之后,str(10字节)使用的内存是否被释放,或者我是否需要在此上显式调用free?

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

8 个答案:

答案 0 :(得分:18)

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

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:3)

是的,它已被“释放”。 (但不是免费的)。)

由于str是一个自动变量,它只会持续与其范围一样长,直到功能块结束。

请注意,你只有free()你的malloc()。

答案 3 :(得分:2)

是的,一旦method1返回,内存将自动释放。 str的内存在堆栈上分配,一旦方法的堆栈帧被清除就被释放。将其与堆上分配的内存(通过malloc)进行比较,您必须明确释放它。

答案 4 :(得分:1)

不,这种局部变量是在堆栈上分配的,所以当你从过程返回时,内存可用于下一个函数调用,它将使用内存作为其堆栈帧。

如果使用malloc(),则会在堆上分配空间,必须明确释放该空间。

答案 5 :(得分:0)

我认为它的释放并不是因为它是原始的,而是它是一个局部变量,它将被分配在堆栈而不是堆上。如果你没有使用它,那么就我记忆中你无法释放它。

答案 6 :(得分:0)

是的,当它超出范围时,它会被“释放” 不,你不必明确地释放它。

char数组在堆栈上分配,因此当您从函数返回时,该堆栈空间可以重复使用。您无需明确释放内存。

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

答案 7 :(得分:0)

我最近在C / C ++方面有点生疏,但我认为你是对的。只要你没有动态分配那个内存,你应该没问题。