【菜鸟请问】关于变量使用结束后调用Dispose方法的疑问

猴头 2013-03-19 11:13:11
请问各位大哥:

我在一个方法中定义并声明一个实现了IDiapose接口的对象,在该对象使用结束后,函数结束的时候调用该对象的Dispose方法和没有调用Dispose方法,在GC执行垃圾回收的时候 对 给该对象分配的内存的处理方式 一样吗???

1、是 在调用了Dispose方法后即使GC还没有执行,那么 给该对象分配的内存就已经被标识为未被占用的(在还未回收垃圾的情况下),在下次需要分配内存的时候,就有可能 给另外的对象 分配 该段内存呢?

2、还是 即使在没有调用Dispose方法,那么 在方法结束后,给局部变量分配的内存就会被自动 标示为 未被占用的呢?

3、或者 ,对于对象掉没掉用Dispose 方法,该段内存在方法结束后即使没有执行GC 都会被标志为未被占用的,会在下次 需要分配内存是,可能分配给别的对象?

额,我自己一会晕了......

...全文
267 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
_小黑_ 2013-03-20
  • 打赏
  • 举报
回复
看看 msdn上面的关于GC 的详细介绍
stonespace 2013-03-20
  • 打赏
  • 举报
回复
Dispose方法主要是用来回收非托管资源,而对象内存是托管资源,不会在Dispose方法中释放,当然Dispose方法也可以释放托管资源,但这不做强制要求, 第一个额问题: GC没有回收之前,对象不管是否调用了Dispose方法,它本身占的内存都不会被释放,不会分配给其他对象, 第二个问题: 当然,不管Dispose是否调用,只要退出方法,没有引用对象的时候,GC会将其释放,但只有GC运行的时候才会被释放,没有运行之前,对象仍然占有内存,不会被其他对象利用, 第三个问题,不会的,在GC运行前对象占用的内存都不会被释放,只是调用Dispose会释放掉非托管资源,
linrachel 2013-03-19
  • 打赏
  • 举报
回复
GC开始执行的时候,它假设托管堆中的所有对象都是可回收的垃圾,然后进入标记阶段,标记阶段GC会遍历所有用户线程的堆栈检查根(根实际上就是方法的局部变量、方法的参数、静态字段),如果发现根引用了某个对象,就会对该对象进行标记(在对象的同步块索引上设置一位)。这个工作结束之后,未被标记的对象就被认为是垃圾,它们占用的内存即将被回收。 接下来进入垃圾的回收阶段(压缩托管堆),这里涉及到一个对象的代的概念。.NET将对象分为0、1、2三代,回收的原则是,新创建的对象优先被回收,即0代对象最先被回收,而且GC每次执行都不是回收所有代的垃圾对象。而且每次垃圾收集执行完毕之后,未被收集的对象的代将会增加,这将进一步延长对象的生存期。 通常来讲,实现IDispose接口的类都应该实现Finalize()方法,这是确保该类的实例能被GC自动回收的关键,否则,在代码中忘记调用Dispose()方法将会造成内存泄漏。但是,依赖GC来回收非托管资源会使这些资源释放时间变得不确定,这里涉及到GC要调用Finalize方法从而使得对象的代增加,而手动调用Dispose()方法,会立即释放非托管资源,并且通知GC将对象的Finalize()从终结队列中移除。从而使得对象在下一次GC执行时即被回收。 乱七八糟写了一些,希望对楼主有所帮助。。
真相重于对错 2013-03-19
  • 打赏
  • 举报
回复
msdn 上边有详细的解释

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧