[問題] GC回收的時機
上一篇的問題 讓我想了一些情況 但是我有很多地方想請教各位 釐清問題
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
11/25 12:55, 2F
→
11/25 12:55, , 3F
11/25 12:55, 3F
→
11/25 12:57, , 4F
11/25 12:57, 4F
→
11/25 17:13, , 5F
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
11/26 00:55, 7F
→
11/26 00:55, , 8F
11/26 00:55, 8F
→
11/26 00:56, , 9F
11/26 00:56, 9F
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章