[問題] GC回收的時機

看板C_Sharp (C#)作者 (我愛阿蓉)時間15年前 (2010/11/24 18:40), 編輯推噓0(009)
留言9則, 2人參與, 最新討論串1/1
上一篇的問題 讓我想了一些情況 但是我有很多地方想請教各位 釐清問題 class A { A(B c){ B = c; } B obj; } void Foo(B c) { A temp1 = new A(c); } static void main() { Foo(new B()); //1 A temp2 = new A(); //B temp3 = temp2.B; //3 temp2 = null; //2 } 以上想問兩個case.... //1 的問題是 當function return 我觀念上是 temp1因為是local變數 該被回收 當作GC時 應該會去回收A所new的空間 但是....裡面有個B, B有指到一個空間 這時GC會怎麼處理?? (1) 不管, 我回收temp1了 所以B跟著被回收造成 沒有人指向 c結果GC連c也回收 (2) GC因為發現B有指到c, 所以會不急著回收A 要等到有人寫temp1.B = null; 才會一連串開始回收A 但如果programmer都沒有寫A.B=null; 就會造成leak? C一直都存在.... 但想一想 如果沒人指到temp1 根本沒機會去把B設成null 所以(1)會成立嗎??? //2 的問題其實和1一樣 就是我先把temp2直接設成null 連動的會把B記憶體位置給回收 接著變成C沒人指到也跟著回收C嗎? //3 如果我外部偷偷有用指標指到temp2.B的話 (註解拿掉) 是不是就能避免GC去回收temp2呢? 找了一些資料 還是不夠解決目前想到的問題 因為之前寫的一些C# code完全沒顧慮這些 想說GC無敵 很怕會有淺在因素 我會造成程式crash... 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.87.64.222 ※ 編輯: QQ29 來自: 219.87.64.222 (11/24 18:45) ※ 編輯: QQ29 來自: 219.87.64.222 (11/24 18:47) ※ 編輯: QQ29 來自: 219.87.64.222 (11/24 18:48)

11/25 12:55, , 1F
你想太多了, 沒有這麼複雜, 第一行其實是
11/25 12:55, 1F

11/25 12:55, , 2F
B b1 = new B(); Foo(b1);
11/25 12:55, 2F

11/25 12:55, , 3F
所以即使你的temp1被GC了, B的空間還是有b1指著
11/25 12:55, 3F

11/25 12:57, , 4F
如果b1 out of scope, 下次GC就會回收B
11/25 12:57, 4F

11/25 17:13, , 5F
d大我第一行寫錯 我故意不用東西指著直接傳進去new B()
11/25 17:13, 5F

11/25 17:13, , 6F
我改一下 @@我覺得這樣會被回收耶
11/25 17:13, 6F
※ 編輯: QQ29 來自: 122.147.15.66 (11/25 17:13)

11/26 00:55, , 7F
GC演算法是看物件會不會被用到, 跟有沒有設成null無關
11/26 00:55, 7F

11/26 00:55, , 8F
你的例子 Foo(new B()) 和 A temp1 = new A(c);
11/26 00:55, 8F

11/26 00:56, , 9F
B和A物件都拿不到也用不到了, 所以下次GC都會回收
11/26 00:56, 9F
文章代碼(AID): #1CxEkd4F (C_Sharp)
文章代碼(AID): #1CxEkd4F (C_Sharp)