程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 關於操作DC時的資源洩露,操作DC資源洩露

關於操作DC時的資源洩露,操作DC資源洩露

編輯:C++入門知識

關於操作DC時的資源洩露,操作DC資源洩露


首先應明確一個概念 句柄, 關於句柄的詳細介紹請見這裡

對於句柄的使用小結:借來的要歸還,創建的要釋放,選出的要選入【尤其是針對GDI的一些句柄而言,如HPEN,HBRUSH等】

 

1. 使用GetDC() 獲取的設備上下文指針在不使用的時候必須調用ReleaseDC()進行釋放

例如:

1 CDC *pDC = GetDlgItem(IDC_TEST)->GetDC(); 2 3 /*...............*/ 4 5 GetDlgItem(IDC_TEST)->ReleaseDC(pDC); View Code

 

2. 在創建了DC或其他GDI資源後,如果不再使用則需要將所創建的資源進行釋放

例如:

1 CDC dcMem;
2 
3 dcMem.CreateCompatibleDC(NULL);
4 
5 /*..............*/
6 
7 dcMem.DeleteDC();

 

3. 在將創建的GDI繪圖對象選入了設備上下文後,如果使用完畢則需要將之前選出的舊有的GDI繪圖對象選入,然後在刪除所創建的GDI對象

例如:

 1 CBitmap bmp;
 2 
 3 bmp.CreateCompatibleBitmap(pDC, nWidht, nHeight);
 4 
 5 CBitmap *pBmpOld = memDC.SelectObject(&bmp);
 6 
 7 /*..................................*/
 8 
 9 memDC.SelectObject(pBmpOld);
10 
11 bmp.DeleteObject();

說明:一定要注意SelectObject的操作通常要成對出現,否則可能會導致GDI資源洩露。例如上面的例子,如果在最後我們沒有執行語句

memDC.SelectObject(pBmpOld);只是調用了bmp.DeleteObject(),此時對於bmp資源的釋放是失敗的,即無法將之前所創建的位圖圖像刪除。

 

Attach 的需要Detach

例如:

 1 CImage img;
 2 
 3 if (SUCCEEDED(img.Load(strFileName)))
 4 
 5 {
 6 
 7   HBITMAP hBitmap = img.Detach();
 8 
 9   /*......................*/
10 
11   img.Attach(hBitmap);
12 
13 }
14 
15 img.Destroy();

 

1. 被選入的繪圖對象(如:bitmap、brush等)無法刪除,只有當調用SelectObject將對象選出後才可以刪除 2. 對於SelectObject()成對出現的原因? 例如:
1 bitmap = CreateCompatibleBitmap(...); 
2 HBITMAP oldbitmap = SelectObject(hdc, bitmap); 
3 ... 
4 SelectObject(hdc, oldbitmap); 
5 DeleteObject(&bitmap) 
注意: 1. SelectObject必須成對存在 2. 對於上面代碼段的第四行,調用SelectObject將oldbitmap選入之後不需要將返回值再賦給bitmap,此時bitmap已經是最新的位圖對象了(哪怕在語句3對選入的位圖進行了操作) 3. 對於GDI繪圖資源的釋放一定要注意,一旦有資源沒有得到釋放,而且執行的頻率又非常頻繁的情況下,就很容易導致資源無法創建的問題。尤其是在OnCtlColor中一定不要創建畫刷等繪圖對象,而是應該將需要用到的繪圖對象定義為類的成員變量。 4. 由於對於GDI而言,windows只使用了16位字段來指明句柄,因此所能創建的GDI句柄總數應不大於64K個,實際上受其他一些限制,整個windwos系統中大概可以容納約16384(0x4000)個GDI對象。一旦超過這個總數,就會使得Windows拋出ResourceException

java 資源洩露問題

catch完後加個finally,在裡面寫out.flush();
out.close();
因為finally裡的東西不管try裡是否實現都會執行,不會洩漏
 

怎保證分享資源的同時不洩露個人隱私?

不會的,離線下載只是把你的文件放中轉站一天幾千萬人用迅雷工作人員該是沒有那麼有心吧 可以放心,網絡運行商會保護你的文件的,至於下載以後是否會被
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved