Resource Leaking
프로그래밍2007. 8. 13. 18:33
MFC 에서, 컨트롤의 색상을 변경하고자 할 때, OnCtlColor()을 사용한다. (버튼 컨트롤 제외)
HBRUSH CPppDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if( pWnd->GetDlgCtrlID() == IDC_DIC)
{
hbr = CreateSolidBrush( RGB(0,0,255) );
pDC->SetBkMode( TRANSPARENT );
pDC->SetBkColor( RGB(0,0,255) );
pDC->SetTextColor( RGB(255,255,0) );
return hbr;
}
return hbr;
}
여기서 문제가 있다. 이 메소드는 해당 컨트롤을 다시 그려야 할 이유가 생길 때 마다 자동적으로 호출된다.
따라서, 프로세스의 메모리 점유가 늘어날 수 밖에 없다.
계속해서 CreateSolidBrush()를 통해 계속해서 브러시를 생성하기 때문.
프로그램 시작시, 단 한번만 브러시를 생성하고 프로그램 종료 시, 생성된 브러시를 파괴해 주는 것으로 이 부분은 해결된다. 코드는 다음과 같다.
생성자에 다음과 같은 코드를 삽입한다.
물론 hBkBrush 는 HBRUSH type 이며, 클래스 정의부분에 명시해 둔다.
hBkBrush = CreateSolidBrush(RGB(0,0,255));
그리고 위의 코드 중, 붉은색으로 된 부분을 다음과 같이 변경한다.
hbr = hBkBrush;
마지막으로, 프로그램 종료시 호출되는 파괴자나, 기타 메소드 중에 적당한 곳을 골라 브러시 객체를 파괴한다.
DeleteObject(hBkBrush);
'프로그래밍' 카테고리의 다른 글
C# TIP 몇가지 (0) | 2007.10.04 |
---|---|
구글 가젯 만들기, Part1 (1) | 2007.08.21 |
WebPage Redirect (MFC / API) (0) | 2007.05.16 |
SetTimer() (0) | 2007.05.14 |
ROBOCODE Master의 비밀!!! (0) | 2007.04.23 |