无论我看起来多么努力,无论我怎么努力,我都找不到为什么这段代码会泄漏。实际上,我不确定泄漏,但每次使用这段代码时GDI对象的数量都会增加。
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 hBmp是泄漏的。我该如何删除它?
DeleteObject无效。
由于
答案 0 :(得分:4)
您负责删除GDI位图和GDI调色板。 但是,您不应该删除GDI位图或GDI调色板 在GDI + Bitmap对象被删除或超出范围之后。
删除Bitmap
对象是不够的,之后需要在hBmp上调用DeleteObject
。
答案 1 :(得分:2)
DeleteObject无效。
我们假设它实际上在您的代码中,即使代码段没有显示它。然后下一个解释就是这句话:
pBMP->GetHBITMAP(col,&hBmp);
它会覆盖hBmp的值,阻止您正确释放它。修正:
HBITMAP prev = hBmp;
Status status = pBMP->GetHBITMAP(col,&hBmp);
if (status == Ok) DeleteObject(prev);
您可能需要在错误处理代码上做更多的工作。
答案 2 :(得分:0)
您需要拨打DeleteObject
来与CreateDIBitmap
的来电相匹配。它究竟是如何运作的?