小议C#引用类型对象在循环引用时会不会内存泄漏
发表于2018-06-07
循环引用指的是A引用了B,而B又引用了A。在写代码的时候,都难免会这样写:地图引用了战斗单位,战斗单位又引用了地图。。
如图:(来源于国外大神的解释)
当A没有再被其他类引用,则A,B,C都应该被垃圾回收。如果判断该对象是否需要被回收的依据是基于引用计数的,那上面代码就会是这样:B被C和A引了,引用计数为2,C被B引了,引用计数为1,这样内存就泄露了。
所以C#的GC并没有用引用计数。GC有一些“根”,对象都挂在上面。从“根”往其子结点进行遍历,就可以标注出哪些对象是被使用的。A对象没有被其他引用,A作为B,C的入口,所以A,B,C都变成了被回收的对象。
综上,C#在做循环引用的时候是不会出现垃圾回收问题的。