Функция Windows DestroyObject для HBITMP работает не очень хорошо (утечка памяти) - PullRequest
1 голос
/ 17 мая 2011

Мне нужно очень часто создавать изображения HBITMAP в программе на C ++, и, конечно, мне нужно удалять эти растровые изображения после использования. Код похож на этот

HBITMAP hBmp;
while(true) {
  hBmp = CreateBitmap(width, height, 1, 8, imageData);
  process(hBmp);
  DeleteObject(hBmp);
}

У меня есть бесконечный цикл в потоке, который непрерывно создает HBITMAP, вызывает функцию, использующую это растровое изображение, а затем удаляет ее. При запуске цикла я проверяю, больше ли используется память процесса, чем в предыдущем цикле, и если это так, я печатаю его. Использование CreateBitmap () и DeleteObject () приводит к небольшой утечке памяти; время от времени использование памяти процесса увеличивается на 4 КБ (иногда каждые 10 секунд, иногда ничего не происходит в течение минут).

Я также проверил его, не вызывая функцию процесса, и проблема все еще существует, так что я думаю, что это связано с обработкой растрового изображения. Кроме того, я провел еще один тест, создавая изображение вне бесконечного цикла (поэтому я создаю его только один раз) и обрабатывая его в бесконечном цикле, и утечки памяти не происходит.

ПРИМЕЧАНИЕ. DeleteObject () всегда возвращает значение> 0 (без ошибок).

Возможно ли, что проблема связана с функцией DeleteObject ()? Что-то не так в создании / удалении растрового изображения таким образом?

ТЕХНИЧЕСКИЕ ПРИМЕЧАНИЯ: Windows XP Borland C ++ Builder 5

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Есть ли вероятность того, что растровое изображение еще где-то выбрано в контексте устройства?Это может привести к сбою DeleteObject, хотя я ожидаю, что он вернет ошибку.

0 голосов
/ 17 мая 2011

Забавно, как обычно проблема в коде, который люди не показывают.

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

Кроме того, ваш контекст не высвобождается должным образом, равно как и все другие объекты, которые вы выбираете в нем. У вас там происходят огромные утечки памяти. Конечно, вы не показываете нам код, поэтому не можете помочь вам с подробностями.

И, наконец, я не совсем понимаю причину создания нового растрового изображения снова и снова, чтобы просто выпустить его. Вы должны создать его вне цикла, затем контекст устройства, затем выбрать его в контекст устройства, и просто , а затем вы запустите свой цикл и очистите растровое изображение, чтобы начать запись в него. Вы получите огромное увеличение производительности.

...