作者QQ29 (我愛阿蓉)
看板C_Sharp
標題[問題] GC回收的時機
時間Wed Nov 24 18:40:36 2010
上一篇的問題 讓我想了一些情況 但是我有很多地方想請教各位 釐清問題
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