【问题标题】:HBITMAP memory leakHBITMAP 内存泄漏
【发布时间】:2011-12-18 22:53:51
【问题描述】:

无论我多么努力地寻找和尝试,我都找不到这段代码泄漏的原因。实际上,我不确定是否存在泄漏,但每次使用这段代码时 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 是泄漏的对象。我应该如何删除它?

删除对象不起作用。

谢谢

【问题讨论】:

    标签: c++ bitmap gdi hbitmap gdi+


    【解决方案1】:

    来自FromHBITMAP documentation

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

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

    【讨论】:

      【解决方案2】:

      删除对象不起作用。

      假设它实际上在您的代码中,即使 sn-p 没有显示它。那么接下来的解释就是这样的说法:

       pBMP->GetHBITMAP(col,&hBmp);
      

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

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

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

      【讨论】:

      • 谢谢。是 GetHBITMAP 阻止了发布。
      【解决方案3】:

      您需要致电 DeleteObject 以匹配对 CreateDIBitmap 的呼叫。它现在具体如何运作?

      【讨论】:

        猜你喜欢
        • 2011-12-14
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2011-10-08
        • 2013-01-20
        • 2011-10-31
        • 2019-08-10
        相关资源
        最近更新 更多