Проблема утечки GDI - PullRequest
       23

Проблема утечки GDI

2 голосов
/ 27 января 2009

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

RM

Ответы [ 7 ]

5 голосов
/ 27 января 2009

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

В общем случае не рекомендуется использовать вложенные вызовы, например

.
HDC hDC1 = GetDC(); 
HDC hDC2 = CreateCompatibleDC(hDC1); 
.. 

вместо

HDC hDC = CreateCompatibleDC(GetDC()); 

(Кстати, в вашем коде HDC, возвращенный GetDC, не освобождается.)

4 голосов
/ 27 января 2009

Убедитесь, что вы звоните ReleaseDC, а не DeleteDC на дескрипторах, возвращенных с GetDC.

1 голос
/ 17 ноября 2011

Могу посоветовать deleteaker найти и исправить утечки.

0 голосов
/ 27 января 2009

Вы не должны удалять hOldObj в последней строке

DeleteObject (hOldObj);

0 голосов
/ 27 января 2009

Прочитайте Petzold. GetDC () действительно база.

0 голосов
/ 27 января 2009

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

MFC имеет различные связанные с GDI объекты, такие как CDC и CMemoryDC и так далее. Они выполнят правильное удаление, когда они больше не нужны.

0 голосов
/ 27 января 2009

(я собирался сказать это, когда заметил, что уже есть комментарий с ответом - кредит переходит к xhantt)

Я не думаю, что освобожден постоянный ток, созданный GetDC () в первой строке.

...