繁体   English   中英

HBITMAP内存泄漏

[英]HBITMAP memory leak

不管我看起来多么努力,无论尝试了什么,我都找不到为什么这段代码泄漏了。 实际上,我不确定泄漏,但是每当我使用这段代码时,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不起作用。

谢谢

FromHBITMAP文档

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

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

DeleteObject不起作用。

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

 pBMP->GetHBITMAP(col,&hBmp);

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

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

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

您需要调用DeleteObject才能将其与CreateDIBitmap匹配。 现在到底如何运作?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM