none
Stream类的Dispose方法不调用可以吗 RRS feed

  • 问题

  • 我在做windows phone8程序的时候用到了Stream类,当一个Stream类型的对象我用完后,我不去调用它的Dispose方法或者不去用using释放它的资源。 这样做会不会引起内存泄露。

    我用  (long)DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage"));  这样的方式来检测内存情况,就我观察的情况来看,怎么感觉不去用using或者Dispose方法手动去释放,它好像也是可以自己释放的。我对这点很是不解。

    请哪位对这方面比较了解的大牛给个正确的答案吧。

    2013年1月27日 3:45

全部回复

  • Dispose主要用于释放宝贵的非托管资源。例如文件,如果你不Dispose的话是不会只动Flush和关闭的。Dispose不能做实质的内存回收(除了非托管资源),它“释放”托管资源的意思是:

    1、把指向托管资源的引用放掉(置为null);

    2、托管的内存回收是垃圾收集器(GC)完成的,这不由Dispose方法控制。

    即使垃圾收集器调用了,程序的内存占用还是不一定减少,公共语言运行时(CLR)并不会立刻把内存还给操作系统,例如CLR可以开30MB内存,然后你用的时候它随时可以分配,而不必向操作系统请求,那样太慢。换言之,你的内存可能被CLR标记为“未使用”,然后等待下一轮分配内存的任务。

    关于更多内容,你可以在网络上搜索“.NET 垃圾回收机制”等内容。



    补充:如果Stream已经是不可达对象(垃圾),在垃圾收集器回收Stream的内存之前,会调用其析构方法。这个析构方法回去调用Dispose方法,从而回收非托管资源。
    • 已编辑 Gee Law 2013年1月28日 14:07 补充内容
    2013年1月28日 14:06