如何防止GDI資源洩露

2021-08-26 06:15:32 字數 1227 閱讀 3259

在windows系列上做程式設計,gdi是乙個很重要的技術點,有很多程式在執行多次後出現異常,除了眾所周知的記憶體洩露以外,gdi資源洩露也是乙個很直接的原因.今天就把我自己在程式設計中總結的一些經驗給大家分享,歡迎高手補充.

1.create出來的gdi物件,一定要用deleteobject來釋放,釋放順序是先create的後釋放,後create的先釋放.

這裡的create指的是以它為開頭的gdi函式,比如,createdibitmap,createfont等等,最後都要呼叫deleteobject來釋放.

2.create出來的dc要用deletedc來釋放,get到的要用releasedc釋放.

3.確保釋放dc的時候dc中的各gdi物件都不是你自己建立的;確保各gdi物件在釋放的時候不被任何dc選中使用.

假如我們要使用gdi函式畫圖,正確的步驟應該如下:

a.建立乙個記憶體相容dc(createcompatibledc)

b.建立乙個記憶體相容bitmap(createcompatiblebitmap)

c.關聯建立的記憶體相容dc和bitmap(selectobject)

d.畫圖

e.bitblt到目的dc上

f.斷開記憶體相容dc和bitmap關聯(selectobject)

g.銷毀記憶體相容bitmap

h.銷毀記憶體相容dc

由於selectobject在選入乙個新的gdi物件的時候會返回乙個原來的gdi物件(假如成功的話),所以需要在步驟c的時候儲存返回值,在步驟f的時候當作入口引數使用.還有,步驟g和步驟h實際上順序可以隨意,因為他們兩個此刻已經沒有關係了,但是為了結構清晰,我建議按照"先create的後釋放,後create的先釋放"的原則進行.

關於步驟f,可能會有爭議,因為即使省略這一步,步驟g和步驟h看起來照樣可以返回乙個成功的值.但實際上可能並沒有執行成功,至少boundschecker會報告有錯,錯誤資訊大致是說,在釋放dc的時候還包含有非預設的gdi物件,在釋放gdi物件的時候又說這個gdi物件還被乙個dc在使用.所以,我建議保留步驟f.

對於cpen 來說,因為是cgdiobject的派生類,

在析構函式中呼叫了deleteobject()函式,所以不需要顯式釋放

,cbrush 同理。但是如果cpen這裡呼叫的是不帶引數的建構函式的話,比如 cpen penyellow; 這樣的話後面必須還要呼叫createpen等函式來對cpen進行初始化工作,此時是需要顯式釋放的,即手動呼叫penyellow.deleteobject();

防止 gdi 洩露

gdi使用的幾個注意點 1 create出來的gdi物件,要用deleteobject釋放,create出來的dc,要用deletedc釋放,getdc得出的dc,用releasedc釋放。2 先create後delete,create1,create2,delete2,delete1的順序。3 畫...

GDI洩露心得

最近,剛剛開始做c 我主要負責頁面上的東西。做完後發現gdi洩露很嚴重。經過總結,主要是以下幾點地方要注意。1.getdc 出來的dc,一定要用releasedc 處理。2.hbitmap要用deleteobject 處理。前天對modifystyle為什麼會出現上述問題的原因查明。modifyst...

GDI記憶體洩露問題

在windows系列上做程式設計,gdi是乙個很重要的技術點,有很多程式在執行多次後出現異常,除了眾所周知的記憶體洩露以外,gdi資源洩露也是乙個很直接的原因.今天就把我自己在程式設計中總結的一些經驗給大家分享,歡迎高手補充.1.create出來的gdi物件,一定要用deleteobject來釋放,...