我最近主要是一个涉及C的项目的Java人员,所以如果这是一个基本的C问题,请耐心等待。
所以在我的主要内部我有一个while循环,我每次迭代都声明一个变量。
int main()
{
int done = 0;
while(!done)
{
char input[1024];
scanf("%s", input);
//parse the input string
...
}
}
现在因为输入变量每次都会改变,这取决于用户想要什么,每次都必须使用“new”变量。但是,我认为上述声明最终会导致内存泄漏(或者它会吗?)。我想知道gcc是否负责垃圾收集。
在每次迭代后没有分配和释放是否有更好的方法?
答案 0 :(得分:6)
我认为上述声明最终会导致内存泄漏(或者会吗?)。
不,它不会:input
是自动(AKA“堆栈”)变量,一旦超出范围(即之后),它将被“解除分配”闭幕式。)
在每次迭代后没有分配和释放是否有更好的方法?
没有实际的分配或解除分配:自动存储器中的空间(堆栈中的AKA)由堆栈指针周围的一些编译时簿记分配。自动变量的访问是一个非常快速的操作,很大程度上由硬件辅助,因此不会有效率损失。
动态内存分配(Java风格)是在C中使用malloc
/ calloc
/ realloc
完成的。这些不是垃圾回收 - 您需要每次都明确free
你分配的指针。
答案 1 :(得分:1)
但是,我认为上述声明最终会导致内存泄漏(或者它会吗?)
不会。每次遇到循环的input
后,都会丢弃}
对象。
答案 2 :(得分:0)
正如其他人已经说过的那样,堆栈变量在超出范围时会自动释放,并且很快就会被覆盖。
话虽如此,我写这个答案的原因是要强调这一点: C中没有垃圾收集器,至少在默认情况下不是这样。这意味着 heap 分配的内存(通常使用malloc
,calloc
和其他内容初始化)必须由您手动释放(使用free
)。