0

无论我多么努力地寻找,无论我尝试了什么,我都找不到这段代码泄漏的原因。实际上,我不确定是否存在泄漏,但每次使用这段代码时,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 不工作。

谢谢

4

3 回答 3

3

FromHBITMAP文档中:

您负责删除 GDI 位图和 GDI 调色板。但是,在 GDI+ 位图对象被删除或超出范围之前,您不应删除 GDI 位图或 GDI 调色板。

删除Bitmap对象是不够的,DeleteObject之后需要调用hBmp。

于 2011-10-31T18:08:33.463 回答
2

DeleteObject 不工作。

让我们假设它实际上在您的代码中,即使代码段没有显示它。那么接下来的解释就是这个语句:

 pBMP->GetHBITMAP(col,&hBmp);

这会覆盖 hBmp 的值,从而阻止您正确释放它。使固定:

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

您可能需要对错误处理代码做更多的工作。

于 2011-10-31T18:33:44.677 回答
0

您需要调用 toDeleteObject以匹配调用 to CreateDIBitmap。它现在具体如何运作?

于 2011-10-31T18:07:09.570 回答