小議C#引用類型對象在循環引用時會不會內存泄漏

循環引用指的是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#在做循環引用的時候是不會出現垃圾回收問題的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章