这样能自动回收内存么?
现有类A、类B以及一个接口名为IB。类A实现IB接口,包含成员一个B类型的成员变量。
A在构造的时候,将自身传入B。
类B实现一个属性接收IB对象并保存在B的成员变量中。
这样B就可以通过IB接口通知A。
现在的问题是,如果在类C中有个成员A类型的成员变量,在C被销毁的时候,A以及B都会被销毁么?
这种循环引用,垃圾回收机制能检查的到么? --------------------编程问答-------------------- 不见得,只有当A和B不被任何其他对象引用时,才会被回收。 --------------------编程问答-------------------- 个人理解
首先,你得确定A,B是否包含非托管代码。
如果包含非托管代码的话,是必须手动释放的。
如果不包含非托管代码的话,那么在你举得例子里面A和B是会销毁的。不管A和B是何种关系,A是被C所引用的,除此之外,只有内部的B会互相引用,那么运行时是可以检测到,A和B除了他们之间互相引用之外不会被其他的对象所引用了。这样的话也是会销毁掉A和B的。 --------------------编程问答-------------------- 使用这个工具 好好地观察一下
http://lzy.iteye.com/blog/344317 --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 一个对象会不会被回收,首先取决于它的引用计数是否已经为0. 如果你的A,B对象确定只有C用到,那么当C被回收后,A和B的引用计数会被清0,这样,它们就会在将来的某个时间被回收,这个时间很难说是什么时候,取决于进程的内存使用情况以及A和B在哪一代堆中。如果A和B中包含非托管资源,这并不影响它们回收的时机,但是当它们被回收时,会发生内存泄露,建议用Dispose模式来管理非托管资源。
另外,如果一个类定义了析构函数,那么它的对象会比没有析构函数的类的对象晚很久才会被回收,除非在某个时刻调用过GC.SuppressFinalize(this)方法。
--------------------编程问答--------------------
如果A类对象不能被回收,那么C类对象就肯定不能被回收。
所谓“销毁”这往往是c程序员瞎说的词儿,在.net中你如何销毁?你只能说你的代码不再引用对象了,而什么时候销毁不是你的代码的事情。 --------------------编程问答-------------------- “垃圾回收机制”非常稳定,肯定能够检测到。因此不乱是.net还是java,都不会像c++那样产生因你的代码错误地delete对象而发生的程序崩溃。
--------------------编程问答--------------------
.NET和COM不同,不使用引用计数判断,也不存在循环引用无法回收内存的问题。简单来说,它会从所谓根对象开始遍历所有可访问的对象,并且标记出来,最后回收所有不可到达的对象。当然这样做也有一个缺点,就是对象的回收时机无法预测。 --------------------编程问答-------------------- 只要a和b不要被root的对象,以及其它确定不会被回收的对象引用,在GC的时候是可以被回收的。
补充:.NET技术 , 分析与设计