2011-10-31 32 views
0

無論我看起來有多困難,無論我嘗試了什麼,我都找不到爲什麼這個代碼泄漏。實際上,我不確定泄漏情況,但每次使用這段代碼時,GDI對象的數量都會增加。HBITMAP內存泄漏

HBITMAP hBmp; 
hBmp = CreateDIBitmap(dc, &stBmpIH, CBM_INIT, m_pBitmapData, m_pBitmapInfo, DIB_RGB_COLORS) ; 

Bitmap *pBMP = NULL; 
HPALETTE hPal = NULL; 
Color col = 0; 

pBMP = Bitmap::FromHBITMAP(hBmp, hPal); 

if (m_bFlip) 
{ 
    pBMP->RotateFlip(Rotate90FlipXY); 
    pBMP->GetHBITMAP(col,&hBmp); 
    m_bFlip = FALSE; 
} 
else 
{ 
    pBMP->RotateFlip(RotateNoneFlipX); 
    pBMP->GetHBITMAP(col,&hBmp); 
} 

delete pBMP; 

我檢查了GDI用工具對象,我發現了什麼是HBITMAP骨形態發生蛋白是泄漏的一個。我應該如何刪除它?

DeleteObject不起作用。

感謝

回答

2

DeleteObject不起作用。

讓我們假設它實際上在你的代碼中,即使代碼片段沒有顯示它。然後下一個解釋是這樣的陳述:

pBMP->GetHBITMAP(col,&hBmp); 

它覆蓋hBmp的值,防止你正確地釋放它。修復:

HBITMAP prev = hBmp; 
Status status = pBMP->GetHBITMAP(col,&hBmp); 
if (status == Ok) DeleteObject(prev); 

您可能需要在錯誤處理代碼上做更多的工作。

+0

謝謝。它是GetHBITMAP,它阻止了釋放。 –

0

您需要DeleteObject打電話到呼叫匹配CreateDIBitmap。它現在如何工作?

4

FromHBITMAP documentation

您有責任刪除GDI的位圖和GDI調色板。 但是,在GDI +位圖對象被刪除或超出範圍之後,您不應刪除GDI位圖或GDI調色板,直到 。

刪除Bitmap對象是不夠的,之後需要在hBmp上調用DeleteObject