C 釋放資源

2022-04-28 19:06:07 字數 1960 閱讀 4716

什麼是資源? .net 框架中如何訪問資源?

在物件導向的環境中,每乙個型別都標識為某些程式所用的資源,要想使用這些資源,必須為相應的型別分配一定的記憶體空間。

訪問乙個資源需要如下幾個步驟:

1)分配記憶體空間: 呼叫中間語言(il)中的newobj指令(使用new操作符時,將產生newobj指令),為某個特定資源的型別分配一定的記憶體空間。

2) 初始化記憶體: 乙個型別的例項構造器負責這樣的初始化工作。

3)使用資源: 通過訪問型別成員來使用資源。根據需要會有反覆。

4)銷毀資源: 執行清理工作。

5)釋放記憶體: 託管堆上的記憶體由gc全權負責, 值引用的在棧上的記憶體會隨著棧空間的消亡而自動消失。

1. 什麼是託管資源,非託管資源?

託管資源是由clr全權負責的資源,clr不負責的資源位非託管資源。 

對於託管資源通過gc自動**。

對於非託管資源gc管理,通過**呼叫手動進行清除。

2. 什麼是垃圾, 什麼是垃圾**?

net型別分為兩大類,乙個就是值型別,另乙個就是引用型別。前者是分配在棧上,並不需要gc**;後者是分配在堆上,因此它的記憶體釋放和**需要通過gc來完成,

那麼只有被稱為垃圾的物件才能被gc**。也就是說,乙個引用型別物件所占用的記憶體需要被gc**,需要先成為垃圾。

那麼.net如何判定乙個引用型別物件是垃圾呢,.net的判斷很簡單,只要判定此物件或者其包含的子物件沒有任何引用是有效的,那麼系統就認為它是垃圾。

記憶體的釋放和**需要伴隨著程式的執行,因此系統為gc安排了獨立的執行緒。那麼gc的工作大致是,查詢記憶體中物件是否成為垃圾,然後對垃圾進行釋放和**。

那麼對於gc對於記憶體**採取了一定的優先演算法進行輪循**記憶體資源。

其次,對於記憶體中的垃圾分為兩種,一種是需要呼叫物件的析構函式,另一種是不需要呼叫的。

gc對於前者的**需要通過兩步完成,第一步是呼叫物件的析構函式,第二步是**記憶體,但是要注意這兩步不是在gc一次輪循完成,即需要兩次輪循;相對於後者,則只是**記憶體。

3. 如何正確的釋放資源?

託管的記憶體資源,這是不需要我們操心的,系統已經為我們進行管理了。

對於非託管的資源,這裡再重申一下,就是stream,資料庫的連線,gdi+的相關物件,還有com物件等等這些作業系統資源,需要我們手動去釋放。

如何去釋放,應該把這些操作放到**比較好呢。.net提供了三種方法,也是最常見的三種,大致如下:

1. 析構函式;

2. 繼承idisposable介面,實現dispose方法;

3. 提供close方法。

析構函式

dispose方法

close方法

意義

銷毀物件

銷毀物件

關閉物件資源

呼叫方式

不能被顯示呼叫,會被gc呼叫

需要顯示呼叫

或者通過using語句

需要顯示呼叫

呼叫時機

不確定

確定,在顯示呼叫或者離開using程式塊

確定,在顯示呼叫時

C 資源釋放

c 記憶體釋放,指標的存在,一直都是很困擾的乙個問題,怎樣釋放資源,成了很大的難題,本文拋磚引玉,整理自己對記憶體的一些理解,並記錄下來,不對之處,還望不吝指正。在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,在執行函式時,函式內區域性變數的儲存單元都可...

C 資源釋放

雖然在.net程式設計過程中,絕大多數記憶體垃圾 由clr 公共語言執行時 自動 但也有很多需要我們編碼 掌握託管與非託管的基本知識,可以有效避免某些情況下導致的程式異常。託管 就是visual basic net和c 編譯器編譯出來的 編譯器把 編譯成中間語言 il 而不是能直接在你的電腦上執行的...

c 安全釋放資源

c 區域性函式中使用new分配記憶體或者create 建立com介面,由於程式可能在函式內下面的判斷 失敗退出,這樣每次都需要delete記憶體或者release,不僅麻煩而且可能忘記其中某個,造成資源沒有及時釋放.下面的通用的類可以解決這些問題 com版 template class t clas...