Утечка памяти HBITMAP - PullRequest
0 голосов
/ 31 октября 2011

Независимо от того, как сильно я выглядел, и что бы я ни пытался, я не мог понять, почему этот код протекает.На самом деле, я не уверен в утечке, но число объектов 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 ]

4 голосов
/ 31 октября 2011

Из документации FromHBITMAP :

Вы несете ответственность за удаление растрового изображения GDI и палитры GDI.Однако не следует удалять растровое изображение GDI или палитру GDI до тех пор, пока объект растрового изображения GDI + не будет удален или выйдет из области видимости.

Недостаточно удалить объект Bitmap, необходимо вызватьDeleteObject на hBmp впоследствии.

2 голосов
/ 31 октября 2011

DeleteObject НЕ работает.

Предположим, что он действительно есть в вашем коде, хотя фрагмент кода не показывает его.Тогда следующее объяснение - это утверждение:

 pBMP->GetHBITMAP(col,&hBmp);

, которое перезаписывает значение для hBmp, препятствуя его правильному выпуску.Исправление:

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

Возможно, вам потребуется еще немного поработать над кодом обработки ошибок.

0 голосов
/ 31 октября 2011

Вам необходимо позвонить на DeleteObject, чтобы сопоставить звонок на CreateDIBitmap. Как именно это сейчас работает?

...