HBITMAP内存泄漏

时间:2011-10-31 18:04:02

标签: c++ bitmap gdi hbitmap gdi+

无论我看起来多么努力,无论我怎么努力,我都找不到为什么这段代码会泄漏。实际上,我不确定泄漏,但每次使用这段代码时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无效。

由于

3 个答案:

答案 0 :(得分:4)

来自FromHBITMAP documentation

  

您负责删除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的来电相匹配。它究竟是如何运作的?