GDI 物件的釋放與記憶體洩漏的問題

2021-09-27 13:03:32 字數 1017 閱讀 5968

gdi 物件的釋放與記憶體洩漏的問題研究

最近寫了乙個gdi 繪圖的程式,過程中遇到乙個奇怪的問題,就是 定時器定時一會gdi繪的圖就消失了。。後來經過分析,原來是 gdi物件數量過多 ,即gdi物件超過10000個 導致記憶體洩漏的問題。找到了問題所在,就好解決了,就是及時釋放gdi物件。

在建立gdi物件的時候,遵循以下規則:

getdc 得到的dc要用 releasedc

createcompatibledc 要用 deletedc

例如:123

4567

891011

1213

1415

1617

1819

2021

22bool clogicchartctrl::drawbmp( cdc* pdc, crect rect, hbitmap hbitmap )

;pdc->alphablend(rect.left,rect.top,nwidth,nheight,&memdc,0,0,nwidth,nheight,bf);

m_bmp.detach();

deleteobject(hbitmap);

deleteobject(bitmap);

deletedc(memdc);

return true;}

所以總結使用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選中使用.

分類: com/stl/wtl/atl, 心隨之筆

C 物件陣列釋放造成記憶體洩漏

物件陣列在釋放的時候,經常會遇到兩種情況,可能會造成記憶體洩漏 例如,geopoint是乙個類 class geopoint geopoint double x,double y geopoint public void setx double x void sety double y double...

記憶體洩漏與記憶體溢位的區別

記憶體溢位 out of memory,是指程式在申請記憶體時,沒有足夠的記憶體空間供其使用,出現out of memory 比如申請了乙個integer,但給它存了long才能存下的數,那就是記憶體溢位。記憶體洩露 memory leak,是指程式在申請記憶體後,無法釋放已申請的記憶體空間,一次記...

記憶體的動態開闢與釋放

malloc free與new delete 1 new會拋異常,但是malloc不會拋異常 2 new delete屬於操作符,但是malloc free屬於函式 3 new申請空間的時候會呼叫建構函式進行初始化,malloc不會 delete釋放記憶體時會呼叫析構函式,free只是切斷了指向關係...