Утечка памяти HBITMAP

#c #bitmap #gdi #hbitmap #gdi

#c #растровое изображение #gdi #hbitmap #gdi

Вопрос:

Как бы я ни старался и что бы я ни пытался, я не мог найти причину утечки этого кода. На самом деле, я не уверен насчет утечки, но количество объектов GDI увеличивается каждый раз, когда я использую этот фрагмент кода.

 HBITMAP hBmp;
hBmp = CreateDIBitmap(dc, amp;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,amp;hBmp);
    m_bFlip = FALSE;
}
else
{
    pBMP->RotateFlip( RotateNoneFlipX );
    pBMP->GetHBITMAP(col,amp;hBmp);
}

delete pBMP;
  

Я проверил объекты GDI с помощью инструмента, и я обнаружил, что утечка происходит в HBITMAP hBmp. Как я должен ее удалить?

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

Спасибо

Ответ №1:

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

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

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

Ответ №2:

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

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

  pBMP->GetHBITMAP(col,amp;hBmp);
  

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

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

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

Комментарии:

1. Спасибо. Именно GetHBITMAP предотвратил выпуск.

Ответ №3:

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