2012-04-19 112 views
1

它更容易顯示的例子後,要問的問題後會發生內存什麼......C#重新分配類

MyClass a = new MyClass(); 

a.initializeData(); 
a = new MyClass(); 

新MyClass的分配空間後,會發生什麼情況我以前的配置呢?是否垃圾收集器會自動收集它,因爲我知道有沒有刪除在C#

我只是想確保我不會有任何內存泄漏。

謝謝!

回答

1

首先,它被稱爲「創建一個對象」,而不是「重新分配一個類」。

垃圾收集的整個想法是,你不關心你沒有引用的對象會發生什麼:你的代碼就像有無限的內存(在合理的範圍內)。垃圾收集器的目的不是爲你釋放內存,it is to simulate that there is an infinite amount of memory

碰巧的是,爲了做到這一點,垃圾收集器可能不退先前分配上您持有不時沒有參考記憶;它也可能重組已使用的內存以防止碎片化,並更新所有引用以指向新的內存位置。所有這些都是你不應該關心的實現細節。

當然,瞭解GC的工作原理非常有趣。 :)

1

孤兒類的內存稍後將從垃圾回收器中解除分配。

This article

+0

感謝您的鏈接! – ThinkNovelty 2014-12-04 21:18:06

0

垃圾收集器跟蹤的參考,因爲有它,以後將收集到的第一個實例沒有提及。

+0

最好是用垃圾收集器檢查是否有引用。這是在收集階段完成的,內存管理系統不使用引用計數來跟蹤引用。 – Guffa 2012-04-19 06:28:39

+0

.NET GC不執行引用計數。 – 2012-04-19 06:29:39

+0

我已經改寫過它。 – weismat 2012-04-19 06:32:15

0

假設你的程序運行了足夠長的時間,並且在將來某個點有足夠的內存壓力或發生了明確的垃圾收集,那麼MyClass的第一個實例將被收集(或將被放到終結器隊列中,如果它已經終結者)。

你不應該擔心會出現這種情況。它可能發生最早是同時initializeData正在執行,之後方法通過this停止訪問任何實例成員(無論是或明或暗地)。


顯式垃圾收集:你不應該在任何時候需要執行此,基準或代碼演示具體的GC行爲之外。

0

是的,垃圾收集器負責刪除未使用的對象。

誰也不能保證當這種情況發生,但因爲它是一個短命的對象,通常會在下次垃圾收集發生。

如果需要時將對象清理(即你在課堂上使用非託管資源)在控制,需要實現IDisposable接口,並調用Dispose方法告訴對象清理資源。