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 パレットを削除しないでください。

オブジェクトを削除するだけでは不十分です。後で hBmpBitmapを呼び出す必要があります。DeleteObject

于 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 に答える