2013-08-26 3 views
-1

내 프로세스의 GDI 개체 수를 작업 관리자에서 보면 GDI 개체의 DeleteObject() 함수 호출이이 숫자를 감소시키지 않는 것을 볼 수 있습니다. 함수 호출은 FALSE를 반환하지 않습니다 (객체 삭제가 실패한 경우와 같아야 함). 필자는 MFC와 같은 추가 라이브러리 및 래퍼없이 일반 Windows API GDI 함수를 사용하고 있습니다. 왜 이러한 상황이 발생할 수 있으며 GDI 리소스 유출을 의미합니까? '이전'GDI 개체를 삭제해도 숫자가 줄어들지 않습니다

void gditest() 
{ 
    HBRUSH h = CreateSolidBrush(RGB(255, 237, 5)); 
    HRGN rgn = CreateRectRgn(0, 100, 100, 0); 

    FillRgn(g_DC, rgn, h); 

    int before = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS); 
    int rs = DeleteObject(h); 
    if (!rs) 
     throw; 
    int after = GetGuiResources(GetCurrentProcess(), GR_GDIOBJECTS); 
} 

변수와 동일한 '후'다음

문제를 재현하는 방법 코드입니다. g_DC는 기본 창의 HDC입니다.

+0

SSCCE를 제공하십시오 –

+4

표준 실수는 여전히 장치 컨텍스트에서 선택한 개체가 있습니다. 그리고 네, 그건 누수입니다. –

+0

이 경우 DeleteObject()가 0을 반환하면 안됩니까? DeleteObject에 대한 MSDN : "지정한 핸들이 유효하지 않거나 현재 DC로 선택되어있는 경우 반환 값은 0입니다." –

답변

1

재고 GDI 개체는 생성되거나 파괴되지 않습니다. Windows에서 유지 관리되며 원하는대로 사용할 수 있습니다. 다음과 같은 코드가있는 경우

HPEN hPen = (HPEN)GetStockObject(BLACK_PEN); 
DeleteObject(hPen); 

GDI 카운트가 올라가거나 내려가는 것을 볼 수 없습니다. DeleteObject에 대한 호출은 개체가 실제로 삭제되지 않더라도 TRUE을 반환합니다.

리소스 누출 여부를 확인하려면 코드에 GetGuiResources (으)로 전화를 걸어 이전/이후 값을 비교할 수 있습니다. 일반적으로 자원 수의 일치, 즉 자원 생성 및 제거가 일치하는 호출을 배치합니다.

+0

주식 오브젝트에서'DeleteObject'를 호출한다고 생각하지 않습니다. –

+1

@Ben 필요하지 않지만 [유해하지 않습니다] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd144925.aspx). – IInspectable

+0

@IInspectable : 디버거에서 DeleteObject()가 단계적으로 실행되고 0이 아닌 값을 반환하지만 TaskMan의 GDI 개체 수가 그대로 유지됩니다. = (같은 개체에 대한 두 번째 DeleteObject 개체 호출이 실패 함 –

0

개체를 삭제하기 전에 장치 컨텍스트에 NULL 개체를 선택해야합니다.

예 :

SelectObject 매크로 (g_DC, GetStockObject (NULL_BRUSH)); DeleteObject (h);

관련 문제