C 託管資源與非託管資源

2022-02-13 21:23:52 字數 1484 閱讀 9457

在.net 程式設計環境中,系統的資源分為託管資源和非託管資源。

託管資源:

net平台中,clr為程式設計師提供了一種很好的記憶體管理機制,使得程式設計師在編寫**時不要顯式的去釋放自己使用的記憶體資源(這些在先前c和c++中是需要程式設計師自己去顯式的釋放的)。這種管理機制稱為gc(garbage collection)。gc的作用是很明顯的,當系統記憶體資源匱乏時,它就會被激發,然後自動的去釋放那些沒有被使用的託管資源(也就是程式設計師沒有顯式釋放的物件)。

所以託管就是.net framework 負責幫你管理記憶體及資源釋放,不需要自己控制,當然物件只針對託管資源(部分引用型別), 不**非託管資源。 像陣列,使用者定義的類、介面、委託,object,字串等引用型別,棧上儲存著乙個位址而已,當棧釋放後, 即使物件已經沒有用了,但堆上分配的記憶體還在,只能等gc收集時才能真正釋放;但注意int,string,float,datetime之類的值型別,gc會自動釋放他們占用的記憶體,不需要gc來**釋放

那麼非託管的資源怎麼釋放**呢?

非託管資源:

對於非託管資源,gc只能跟蹤非託管資源的生存期,而不知道如何去釋放它。這樣就會出現當資源用盡時就不能提供資源能夠提供的服務,windows的執行速度就會變慢。比如當你鏈結了資料庫,用完後你沒有顯式的釋放資料庫資源,如果還是不斷的申請資料庫資源,那麼到一定時候程式就會丟擲乙個異常。

所以,當我們在類中封裝了對非託管資源的操作時,我們就需要顯式,或者是隱式的釋放這些資源在.net中釋放非託管資源主要有2種方式,dispose,finalize,而finalize和dispose方法分別就是隱式和顯式操作中分別使用到的方法。

例如檔案流,資料庫的連線,系統的視窗控制代碼,印表機資源等等,當你讀取檔案之後,就需要對各種stream進行dispose等操作。比如 sqldatareader 讀取資料完畢之後,需要 reader.dispose();等

finalize一般情況下用於基類不帶close方法或者不帶dispose顯式方法的類,也就是說,在finalize過程中我們需要隱式的去實現非託管資源的釋放,然後系統會在finalize過程完成後,自己的去釋放託管資源。在.net中應該盡可能的少用析構函式釋放資源,msdn2上有這樣一段話:實現 finalize 方法或析構函式對效能可能會有負面影響,因此應避免不必要地使用它們。用 finalize 方法**物件使用的記憶體需要至少兩次垃圾**。所以有析構函式的物件,需要兩次,第一次呼叫析構函式,第二次刪除物件。而且在析構函式中包含大量的釋放資源**,會降低垃圾**器的工作效率,影響效能。所以對於包含非託管資源的物件,最好及時的呼叫dispose()方法來**資源,而不是依賴垃圾**器。

C 託管資源 與 非託管資源

託管資源一般是指被clr控制的記憶體資源,這些資源的管理可以由clr來控制,net可以自動進行 主要是指託管堆上分配的記憶體資源。例如程式中分配的物件,作用域內的變數等 非託管資源 不受clr控制和管理的資源,比如檔案流,資料庫的連線,網路連線,系統的視窗控制代碼,印表機資源等,可以認為作業系統資源...

C 託管資源和非託管資源

託管資源指的是.net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作是不需要人工干預的,有.net執行庫在合適呼叫垃圾 器進行 非託管資源指的是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,例如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這...

託管資源和非託管資源

託管資源 net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作不需要人工干預的,有.net執行庫在合適時呼叫垃圾 器進行 非託管資源 是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這類資源,垃...