Как мне выпустить структуру BITMAP? - PullRequest
0 голосов
/ 30 января 2019

После использования структуры BITMAP для получения информации о растровом изображении ...

BITMAP bm;
HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(...);
GetObject(phBitmap, sizeof(BITMAP), &bm );

Как мне выпустить / освободить / удалить bm?

Пробовал с deleteи DeleteObject, никто не работал.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вам нужно будет использовать оператор delete, только если вы присвоили BITMAP с оператором new.(Современный идиоматический C ++ также препятствует ручному управлению памятью, но, поскольку вы задали этот вопрос в своем вопросе, вот и все).

A BITMAP представляет собой структуру измерений значений POD и данных пикселей, а такжеHBITMAP может быть дескриптором BITMAP, если он назначен как таковой.HBITMAP нужно необходимо разблокировать с помощью вызова DeleteObject, когда он больше не нужен и больше не выбран в DC, даже если он был размещен в стеке;BITMAP в стеке исчезнет, ​​когда он выйдет из области видимости.

Существует разница между оператором delete и функцией GDI Windows DeleteObject.delete - ключевое слово C ++ для удаления объектов из кучи;DeleteObject - это вызов API для освобождения ресурсов GDI.

0 голосов
/ 30 января 2019

Я бы сказал, что

HBITMAP hBitmap;
hBitmap = (HBITMAP)LoadImage(...);

должно быть лучше / лучше

HANDLE handle = LoadImage(...);
if (NULL == handle)
{
  /*handle error */
}
else
{
  HBITMAP hbitmap = handle;

  {
    BITMAP bm = {0}; /* allocate and
            initialise bm on the stack. */

    GetObject(hbitmap, sizeof bm, &bm);

    /* Use bm here. */

   } /* Have bm be deallocated or at least
          be inaccessible from here on. */

   DeleteObject(hbitmap);
}

Это дескриптор, который ссылается на ресурс, который должен быть освобожден, когда он больше не используется.

...