c中的垃圾收集器用于循环内的变量

时间:2013-01-14 22:29:29

标签: c memory-management memory-leaks garbage-collection

我最近主要是一个涉及C的项目的Java人员,所以如果这是一个基本的C问题,请耐心等待。

所以在我的主要内部我有一个while循环,我每次迭代都声明一个变量。

int main()
{
  int done = 0;
  while(!done)
  {
    char input[1024];
    scanf("%s", input);
    //parse the input string
    ...
  }
} 

现在因为输入变量每次都会改变,这取决于用户想要什么,每次都必须使用“new”变量。但是,我认为上述声明最终会导致内存泄漏(或者它会吗?)。我想知道gcc是否负责垃圾收集。

在每次迭代后没有分配和释放是否有更好的方法?

3 个答案:

答案 0 :(得分:6)

  

我认为上述声明最终会导致内存泄漏(或者会吗?)。

不,它不会:input自动(AKA“堆栈”)变量,一旦超出范围(即之后),它将被“解除分配”闭幕式。)

  

在每次迭代后没有分配和释放是否有更好的方法?

没有实际的分配或解除分配:自动存储器中的空间(堆栈中的AKA)由堆栈指针周围的一些编译时簿记分配。自动变量的访问是一个非常快速的操作,很大程度上由硬件辅助,因此不会有效率损失。

动态内存分配(Java风格)是在C中使用malloc / calloc / realloc完成的。这些不是垃圾回收 - 您需要每次都明确free你分配的指针。

答案 1 :(得分:1)

  

但是,我认为上述声明最终会导致内存泄漏(或者它会吗?)

不会。每次遇到循环的input后,都会丢弃}对象。

答案 2 :(得分:0)

正如其他人已经说过的那样,堆栈变量在超出范围时会自动释放,并且很快就会被覆盖。

话虽如此,我写这个答案的原因是要强调这一点: C中没有垃圾收集器,至少在默认情况下不是这样。这意味着 heap 分配的内存(通常使用malloccalloc和其他内容初始化)必须由您手动释放(使用free)。