在.NET中取消分配堆栈内存

时间:2016-09-13 08:41:15

标签: c# .net memory-management stack heap

今天,我在CodeProject上阅读了一篇关于内存管理.NET的博客。

网址 - Article

它说 -

  

退出方法(乐趣):现在最终执行控制开始   退出方法。当它通过结束控制时,它会清除所有   在堆栈上分配的内存变量。换句话说就是全部   与int数据类型相关的变量在中取消分配   堆叠中的'LIFO'时尚。

     

最大的收获 - 它没有取消分配堆内存。这个记忆   稍后将被垃圾收集器取消分配。

根据我的理解,垃圾收集器只取消分配堆内存。那么,谁将取消分配堆栈内存?

请建议。

3 个答案:

答案 0 :(得分:1)

即使没有垃圾收集,堆栈中的值也可以自动管理,因为每次您输入/退出范围(方法或语句)时,都以LIFO方式从堆栈中添加和删除项目,这正是变量的原因在for循环内定义,或者if语句在该范围外不可用。

用完堆栈上的所有可用空间后,您将收到一个StackOverflowException,尽管几乎可以肯定,这是无限循环(错误!)或设计不完善的系统(涉及近乎无穷递归调用)的征兆。

答案 1 :(得分:0)

简而言之:

堆栈存储器未被释放。这是一块可以重复使用的内存块。每次范围声明变量(推入堆栈)时,它将在范围退出时弹出。

因此,当调用方法时,参数(值或引用指针)(复制)推送到堆栈并从中弹出,当方法结束。 (弹出只是调整指针(索引)与内存)

这就是为什么{ }中声明的变量在de }

后面不可用的原因

这个内存块是每个线程。

答案 2 :(得分:0)

在.NET中,变量位于堆栈中,无论它是否包含数字(值类型),结构(完全位于堆栈上)或引用object(即对象的托管地址,对象本身位于堆上)。

此外,人们有时会将变量与类字段混淆。字段和所有类成员位于堆上,在实例化对象时分配的区域内。

因此,没有任何变量的分配或解除分配,因为它们只是超出范围的值。变量超出范围后,GC无法到达实际(堆)对象并最终收集它。