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

关于C#内存释放的几个疑问

List<Player> list = new List<Player>(m_PlayerList);
list是个临时对象 因为是拷贝的m_PlayerList Player也有许多new出的对象

怎样处理 才能让系统回收这个list的所有东西

直接list.Clear() 行么。

还是要遍历list下每个Player 清理Player下的所有new出的对象引用 再把player=null
最后list=null

有这个必要么。?

不知道怎么做系统才会回收这个拷贝出来的内存列表 --------------------编程问答-------------------- 有必要关心这个吗?你不用了自然会在需要的时候去释放。 --------------------编程问答-------------------- list=null就可以了,其他的也不管用 --------------------编程问答-------------------- c#不是c/c++ c#带有GC的语言,  会在一定条件下跟进GC算法进行回收不用的资源
所以写c#程序不推荐考虑这些问题 --------------------编程问答-------------------- 赋值为空的时候并没有释放内存,仅仅是把对象指向了一个空地址。
C#里面释放内存是由CLR的GC来维护的。它会定时的去回收不在引用的对象。不用人工干预。 --------------------编程问答-------------------- 不懂我知道的,能不能有助于LZ,我知道,GC是要通过引用才能去访问托管堆中的对象,也就是说,对于copy的对象或者说对于已有的对象,除非已有的引用,才能访问他们。Microsoft有想过做“引用计数”的GC,但是对于“引用计数”的GC,如果引用存在进程时,就永远不能去掉了(如果进程不终止的话)。所以,平常的GC,也是类似于Java中的GC,也就是说,持有托管堆中的对象的引用,如果为空时,再加上自己的算法“定时”去清楚。所以我觉得,对于LZ的list,因为每个元素都是Obje,即都是可以通过引用去访问的,所以是要去遍历的。。。别把这东西想得很神奇,就是这样了,要不然你以为怎么清楚。 --------------------编程问答--------------------
引用 4 楼 lifeilin6671 的回复:
赋值为空的时候并没有释放内存,仅仅是把对象指向了一个空地址。
C#里面释放内存是由CLR的GC来维护的。它会定时的去回收不在引用的对象。不用人工干预。
+1
--------------------编程问答-------------------- 可以显示调用DC --------------------编程问答-------------------- 托管的就不用考虑内存回收。。CLR会帮我们的,, --------------------编程问答-------------------- 出括号就没了 --------------------编程问答-------------------- C# 的GC  垃圾回收机制,一般的只要设为null,系统就会自动回收内存啊,当然也有一部分是需要我们自己动手释放内存的 --------------------编程问答-------------------- 建议数组,list等最好还是手动置空,有dispose方法的最好及时调用。虽然垃圾回收是会清理,但是你手动清理一下也没错,就好比虽然到处都有环卫工人,但你把垃圾扔进垃圾箱还是没有错的,很多时候这也能帮你回避很多问题,养成好的习惯即使今后你需要使用C,C++这类没有垃圾回收机制的语言时不会出现大的问题。特别是需要长时间运行或者占大内存(这种需显示调用gc),最好不要等gc来回收,不然你会发现每过几天你的程序就因内存溢出而停掉了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,