C 託管資源 與 非託管資源

2022-03-03 18:33:53 字數 1005 閱讀 6502

託管資源一般是指被clr控制的記憶體資源,這些資源的管理可以由clr來控制,.net可以自動進行**,主要是指託管堆上分配的記憶體資源。例如程式中分配的物件,作用域內的變數等

非託管資源:不受clr控制和管理的資源,比如檔案流,資料庫的連線,網路連線,系統的視窗控制代碼,印表機資源等,可以認為作業系統資源的一組api。這類資源一般不存在於heap(堆,記憶體中用於儲存物件例項的地方)中。

.net平台中,clr為程式設計師提供了一種很好的記憶體管理機制,使得程式設計師在編寫**時不需要顯式的去釋放自己使用的記憶體資源(這些在先前c和c++中是需要程式設計師自己去顯式的釋放的)。這種管理機制稱為gc(garbage

collection)。gc的作用是很明顯的,當系統記憶體資源匱乏時,它就會被激發,然後自動的去釋放那些沒有被使用的託管資源(也就是程式設計師沒有顯式釋放的物件)。

但是,clr的gc功能也只能釋放託管資源,對於非託管資源例如視窗,檔案和網路連線等,它都只能跟蹤非託管資源的生存期,而不知道如何去釋放它。這樣就會出現當資源用盡時就不能提供資源能夠提供的服務,windows的執行速度就會變慢。這樣的情況會出現在資料庫的連線當中,當你沒有顯式的釋放乙個資料庫資源時,如果還是不斷的申請資料庫資源,那麼到一定時候程式就會丟擲乙個異常。

在.net的物件中實際上有兩個用於釋放資源的函式:dispose和finalize。finalize的目的是用於釋放非託管的資源,而dispose是用於釋放所有資源,包括託管的和非託管的。

msdn建議按照下面的模式實現idisposable介面:

public

class

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不知道如何 的資源,最常見的一類非託管資源是包裝作業系統資源的物件,如檔案,視窗,網路連線,資料庫連線,畫刷,圖示等。這類資源,垃...