2011-10-31 31 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