
寫C#程式也有一段時間了,算一算現在寫的這個程式已是第四個用C#寫的較有規模的程式。一直以來因為懶惰和玩不完的電動,都沒有好好去研究C#中資源釋放的問題,尤其後來這三次寫的程式都需要用到以C++寫成的Library(以C++/CLI寫一個Wrapper Class來包裝),有二次要用到Managed DirectX,對於各種資源的管理更顯得重要。所以這一次就稍微認真了點,去搜尋了一下C#資源釋放的相關文章來做個統整。
剛接觸C#沒多久的人,通常對於GC(Garbage Collector)都會跟我有一樣的茫然,「GC什麼時候會回收資源?」、「哪些東西會被GC回收?」、「太倚賴GC是不是會造成程式效率低落?」,以下就從基礎開始談起GC的運作機制。
在執行.NET的程式時,對於不同型別,CLR(Common Language Runtime)會在不同的地方分配資源空間。對於實值型別(Value Type),當宣告一個變數時,CLR會在Stack(堆疊)中配置一塊空間,設定該變數的值時,其值也直接存放於該空間中,如下圖:
而對於參考型別(Reference Type),CLR則在Stack中配置一塊存放記憶體位址的空間,在初始化該型別的實體時(ex: new),則在Heap(堆積)上配置該型別所需的空間,再將該空間的位址傳回給存放在Stack中的那塊空間,如下圖: