小议C#引用类型对象在循环引用时会不会内存泄漏

发表于2018-06-07
评论5 6.3k浏览

循环引用指的是A引用了B,而B又引用了A。在写代码的时候,都难免会这样写:地图引用了战斗单位,战斗单位又引用了地图。。

 如图:(来源于国外大神的解释)

A没有再被其他类引用,则ABC都应该被垃圾回收。如果判断该对象是否需要被回收的依据是基于引用计数的,那上面代码就会是这样:BCA引了,引用计数为2CB引了,引用计数为1,这样内存就泄露了。

 

所以C#GC并没有用引用计数。GC有一些“根”,对象都挂在上面。从“根”往其子结点进行遍历,就可以标注出哪些对象是被使用的。A对象没有被其他引用,A作为BC的入口,所以A,B,C都变成了被回收的对象。

 

综上,C#在做循环引用的时候是不会出现垃圾回收问题的。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: