. net中栈内存的取消分配

本文关键字:取消 分配 内存 net | 更新日期: 2023-09-27 18:06:41

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

URL -文章

显示-

退出方法(乐趣):现在执行控制终于开始了退出方法。当它传递end控件时,它清除所有的在堆栈上赋值的内存变量。换句话说与int数据类型相关的变量在'后进先出'方式。

最大的问题-它没有取消堆内存的分配。该内存将稍后由垃圾回收器重新分配。

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

请建议。

. net中栈内存的取消分配

即使没有垃圾收集,堆栈上的值也会自动管理,因为每次进入/退出一个作用域(无论是方法还是语句)时,都会以后进先出的方式从堆栈中添加和删除项,这正是为什么在for循环或if语句中定义的变量在该作用域之外不可用的原因。

当你用完堆栈上的所有可用空间时,你将收到一个StackOverflowException,尽管这几乎肯定是一个无限循环(bug!)或设计不良的系统的症状,它涉及几乎无穷无尽的递归调用。

总之:

堆栈内存没有被释放。这是一块将被重用的内存。每次作用域声明变量(压入堆栈)时,它将在作用域退出时弹出。

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

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

之后不可用的原因。

在。net中,变量位于堆栈上,无论它是保存数字(值类型),结构(完全位于堆栈上)还是对对象的引用(即对象的托管地址,对象本身位于堆上)。

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

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