记忆,原语和c

时间:2011-04-28 02:59:19

标签: c

假设我正在声明基元或基元数组(在堆栈右侧)。如何“释放”或清理它们以免它们没有记忆/泄漏?

例如:

int blah;
blah=7;
doSomethingWithBlah...
free(blah) //[?]

可能没什么特别的交易;但是如果你说了一个巨大的char数组或其他怎么办?

任何“本地”变量(即函数内部)都将默认为“auto”并自动清理[在Java术语中,它们在超出范围时会被GC化)。

好奇,谢谢。

5 个答案:

答案 0 :(得分:1)

当堆栈帧被销毁时(即函数返回时),堆栈上的局部变量不再存在。当堆栈框架仍然存在时,无法移除它们。

如果你需要一个大型数组,你应该使用malloc()在堆上分配它,这样你就可以free()完成它。 (用于访问数组的指针变量仍保留在堆栈中,但这很小。)

答案 1 :(得分:1)

您没有从堆栈中“清理”或“释放”数据,因为一旦返回函数,内存可以再次使用,因此没有必要。所以blah不应该被“清理”(但是一旦函数返回,你就不能传递对它的引用......)

答案 2 :(得分:1)

据我所知,C中堆栈上声明的局部变量将作为函数激活记录的一部分进行分配,因此在函数返回时进行回收。

我不相信有任何方法可以“释放”在堆栈上声明的数据。

答案 3 :(得分:1)

你做不到。堆栈变量在超出范围时(在包含块的末尾)被“释放”。

大型结构/数组/等你在堆上的malloc。

请注意,您说“在Java术语中,它们在超出范围时会被GC化” ...这是不正确的,也是一种思考问题的坏方法。 java中的所有对象都是在堆上创建的,并且在没有对它们的剩余引用时可供垃圾收集器使用。这与C非常非常不同,在C中您可以在堆栈上创建内容并且(错误地)将指针返回给调用者。

答案 4 :(得分:1)

你没有。

堆栈是一种数据结构。它是LIFO(Last In,First Out),这意味着放在堆栈上的最后一件事是第一个从堆栈中删除的东西。以下是您在编程中如何考虑这一点的方法:

主要 - > FOO

主函数(入口点)调用一些函数foo。某些变量在main函数中声明/定义。其他在foo函数中声明,它们处于不同的范围。

当您进入程序时,main中声明的所有变量都将被压入堆栈的块中。调用时与foo相同,但是下一个块。然后当它到达foo函数的末尾时,它会从堆栈中弹出那组变量(或者“释放”它们)。当它到达main函数的末尾时,它会从堆栈中弹出那组变量。

因此,为了回答您的问题,所有局部变量(包括存储在堆栈中的本地数组)在超出范围时会自动删除。你永远不必自己解放。

你只是担心你放在堆上的东西,这是你在C中使用“malloc”或在C ++中使用“new”的任何时候。