Вопрос

С помощью диспетчера задач я заметил, что в следующем коде есть утечка 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);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top