看板 C_Sharp 關於我們 聯絡資訊
上一篇的問題 讓我想了一些情況 但是我有很多地方想請教各位 釐清問題 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)
deuter:你想太多了, 沒有這麼複雜, 第一行其實是 11/25 12:55
deuter:B b1 = new B(); Foo(b1); 11/25 12:55
deuter:所以即使你的temp1被GC了, B的空間還是有b1指著 11/25 12:55
deuter:如果b1 out of scope, 下次GC就會回收B 11/25 12:57
QQ29:d大我第一行寫錯 我故意不用東西指著直接傳進去new B() 11/25 17:13
QQ29:我改一下 @@我覺得這樣會被回收耶 11/25 17:13
※ 編輯: QQ29 來自: 122.147.15.66 (11/25 17:13)
deuter:GC演算法是看物件會不會被用到, 跟有沒有設成null無關 11/26 00:55
deuter:你的例子 Foo(new B()) 和 A temp1 = new A(c); 11/26 00:55
deuter:B和A物件都拿不到也用不到了, 所以下次GC都會回收 11/26 00:56