Вопрос
С помощью диспетчера задач я заметил, что в следующем коде есть утечка GDI.Количество объектов GDI в процессе выполнения этого кода увеличивается на 1 при каждом его выполнении, однако я не могу найти проблему.
Любая помощь будет оценена по достоинству.
// create new DC based on current
HDC hDC = CreateCompatibleDC(GetDC());
// select a bitmap into the new DC and keep the old one
HGDIOBJ hOldObj = SelectObject (hDC,hBM);
// do somthing here --> 100% no leak here
SomeFunction (hDC);
// select the old object back from whence it came and delete whats returned
DeleteObject (SelectObject (hDC,hOldObj));
// delete the DC
DeleteDC(hDC);
// delete the tmp object
DeleteObject (hOldObj);
РМ
Решение
Копируя комментарий, я не поставил его в качестве ответа, так как не могу его проверить и не был уверен, что он правильный, пожалуйста, проверьте.
В общем, не очень хорошая идея иметь вложенные вызовы, т.е.
HDC hDC1 = GetDC();
HDC hDC2 = CreateCompatibleDC(hDC1);
..
вместо
HDC hDC = CreateCompatibleDC(GetDC());
(Кстати, в вашем коде HDC, возвращаемый GetDC, не освобождается.)
Другие советы
Обязательно позвоните ReleaseDC
нет DeleteDC
на ручках, возвращенных из GetDC
.
Могу посоветовать deleaker найти и устранить утечки.
(Я собирался сказать это, когда заметил, что уже был комментарий с ответом - заслуга принадлежит xhantt)
Я не думаю, что DC, созданный GetDC() в первой строке, выпущен.
Думаю, на этот вопрос уже есть ответ.Я хочу сразу же порекомендовать различные классы и оболочки интеллектуальных указателей, доступные для объектов GDI.
MFC имеет различные объекты, связанные с GDI, такие как CDC, CMemoryDC и т. д.Они выполнят правильное удаление, когда они больше не нужны.
Прочтите Петцольда.GetDC() на самом деле является основой.
Вам не следует удалять hOldObj в последней строке.
УдалитьОбъект (hOldObj);