託管資源一般是指被clr控制的記憶體資源,這些資源的管理可以由clr來控制,.net可以自動進行**,主要是指託管堆上分配的記憶體資源。例如程式中分配的物件,作用域內的變數等
非託管資源:不受clr控制和管理的資源,比如檔案流,資料庫的連線,網路連線,系統的視窗控制代碼,印表機資源等,可以認為作業系統資源的一組api。這類資源一般不存在於heap(堆,記憶體中用於儲存物件例項的地方)中。
.net平台中,clr為程式設計師提供了一種很好的記憶體管理機制,使得程式設計師在編寫**時不需要顯式的去釋放自己使用的記憶體資源(這些在先前c和c++中是需要程式設計師自己去顯式的釋放的)。這種管理機制稱為gc(garbage
collection)。gc的作用是很明顯的,當系統記憶體資源匱乏時,它就會被激發,然後自動的去釋放那些沒有被使用的託管資源(也就是程式設計師沒有顯式釋放的物件)。
但是,clr的gc功能也只能釋放託管資源,對於非託管資源例如視窗,檔案和網路連線等,它都只能跟蹤非託管資源的生存期,而不知道如何去釋放它。這樣就會出現當資源用盡時就不能提供資源能夠提供的服務,windows的執行速度就會變慢。這樣的情況會出現在資料庫的連線當中,當你沒有顯式的釋放乙個資料庫資源時,如果還是不斷的申請資料庫資源,那麼到一定時候程式就會丟擲乙個異常。
在.net的物件中實際上有兩個用於釋放資源的函式:dispose和finalize。finalize的目的是用於釋放非託管的資源,而dispose是用於釋放所有資源,包括託管的和非託管的。
msdn建議按照下面的模式實現idisposable介面:
publicclass
foo: idisposable
protected
virtual
void dispose(bool
disposing)
//釋放非託管資源
disposed = true
; }
}//析構函式不是人工呼叫,由垃圾**器呼叫,用於釋放非託管資源
~foo()
}
原文:
C 託管資源與非託管資源
在.net 程式設計環境中,系統的資源分為託管資源和非託管資源。託管資源 net平台中,clr為程式設計師提供了一種很好的記憶體管理機制,使得程式設計師在編寫 時不要顯式的去釋放自己使用的記憶體資源 這些在先前c和c 中是需要程式設計師自己去顯式的釋放的 這種管理機制稱為gc garbage col...
C 託管資源和非託管資源
託管資源指的是.net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作是不需要人工干預的,有.net執行庫在合適呼叫垃圾 器進行 非託管資源指的是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,例如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這...
託管資源和非託管資源
託管資源 net可以自動進行 的資源,主要是指託管堆上分配的記憶體資源。託管資源的 工作不需要人工干預的,有.net執行庫在合適時呼叫垃圾 器進行 非託管資源 是.net不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這類資源,垃...