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只是切斷了指向關係...