当前位置:编程学习 > C#/ASP.NET >>

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

请问各位大哥:

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

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

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

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

内存 Dispose方法 --------------------编程问答-------------------- msdn 上边有详细的解释
--------------------编程问答-------------------- GC开始执行的时候,它假设托管堆中的所有对象都是可回收的垃圾,然后进入标记阶段,标记阶段GC会遍历所有用户线程的堆栈检查根(根实际上就是方法的局部变量、方法的参数、静态字段),如果发现根引用了某个对象,就会对该对象进行标记(在对象的同步块索引上设置一位)。这个工作结束之后,未被标记的对象就被认为是垃圾,它们占用的内存即将被回收。
接下来进入垃圾的回收阶段(压缩托管堆),这里涉及到一个对象的代的概念。.NET将对象分为0、1、2三代,回收的原则是,新创建的对象优先被回收,即0代对象最先被回收,而且GC每次执行都不是回收所有代的垃圾对象。而且每次垃圾收集执行完毕之后,未被收集的对象的代将会增加,这将进一步延长对象的生存期。
通常来讲,实现IDispose接口的类都应该实现Finalize()方法,这是确保该类的实例能被GC自动回收的关键,否则,在代码中忘记调用Dispose()方法将会造成内存泄漏。但是,依赖GC来回收非托管资源会使这些资源释放时间变得不确定,这里涉及到GC要调用Finalize方法从而使得对象的代增加,而手动调用Dispose()方法,会立即释放非托管资源,并且通知GC将对象的Finalize()从终结队列中移除。从而使得对象在下一次GC执行时即被回收。

乱七八糟写了一些,希望对楼主有所帮助。。 --------------------编程问答-------------------- Dispose方法主要是用来回收非托管资源,而对象内存是托管资源,不会在Dispose方法中释放,当然Dispose方法也可以释放托管资源,但这不做强制要求,

第一个额问题:

GC没有回收之前,对象不管是否调用了Dispose方法,它本身占的内存都不会被释放,不会分配给其他对象,

第二个问题:

当然,不管Dispose是否调用,只要退出方法,没有引用对象的时候,GC会将其释放,但只有GC运行的时候才会被释放,没有运行之前,对象仍然占有内存,不会被其他对象利用,

第三个问题,不会的,在GC运行前对象占用的内存都不会被释放,只是调用Dispose会释放掉非托管资源,
--------------------编程问答-------------------- 看看 msdn上面的关于GC 的详细介绍
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,