非託管資源建立與釋放

2021-07-06 11:04:30 字數 874 閱讀 6971

現象:

主程式呼叫我的dll庫無法執行;異常資訊顯示

bug:

exception:引數無效。

system.argumentexception

stack trace:

在 system.drawing.graphics.checkerrorstatus(int32 status)

在 system.drawing.graphics.drawstring(string s, font font, brush brush, rectanglef layoutrectangle, stringformat format)

在 nova.rss.rsstoimage.rssitemassingleline(rssiteminfo item, int32 wndheight, bitmap& bmp)

在 nova.rss.rsstoimage.rsstosinglelineimage(rssinfo rssinfo, int32 wndheight, color backcolor, list`1& imglist)

解決過程:

最後將問題鎖定到了其中的引數font font上,替換從上層傳入的font為固定的font;異常資訊出現在了其他的含有font引數的函式中。

推斷,主程式所賦值的最外層介面的font有問題,該font為介面所在類的乙個成員變數。檢視外層**後發現,外層的所傳入到類成員變數的font,來自於乙個公共的引數庫。所以外層傳入的這個font並沒有問題。

我的dll庫這個類含有乙個dispose方法,而這個方法中有乙個語句執行的是對成員變數_font的登出操作,問題就出在這裡。

外層呼叫了我的dispose方法後,導致了外層所用的font的釋放。

結論:釋放資源應該遵循誰建立誰釋放原則。

C 釋放非託管資源

c 中資源分為託管資源和非託管資源。託管資源由垃圾 器控制如何釋放,不需要程式設計師過多的考慮 當然也程式設計師也可以自己釋放 非託管資源需要自己編寫 來釋放。那麼編寫好的釋放非託管資源的 釋非 由誰來呼叫呢。有兩種實現方式 一 將釋非 放到建構函式析構函式中,由系統自動呼叫,系統會在資源物件不再使...

非託管資源的釋放

與c 一樣,c 可以定義析構函式。但c 的析構函式主要用於釋放託管資源。在net中,由gc垃圾 執行緒掌握物件資源的釋放,程式設計師無法掌控析構函式的呼叫時機。為了完全掌控非託管資源的釋放,net提供乙個idisposable介面。問題 finalize 和dispose 之間的區別?最簡單的解釋是...

C 託管資源與非託管資源

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