내 응용 프로그램에서 GetDC를 사용하여 DC를 받고 있는데 ReleaseDC를 사용하여 해당 DC를 릴리스하고 있습니다.GDI 리소스 누출 처리 방법
VTune으로 응용 프로그램을 프로파일 링 할 때 GetDC에서 GDIResource Leak가 표시됩니다.
다음
m_hdc = ::GetDC(hWndDisplay[frameIndex]);
::SetStretchBltMode(m_hdc,STRETCH_DELETESCANS);
::StretchDIBits(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY);
::ReleaseDC(hWndDisplay[frameIndex],m_hdc);
관련 코드 : m_hDC 있습니다 이드 HDC의 m_hDC 있습니다 세계적으로 정의;
void Display(unsigned char *rgbavpg,unsigned long imageSize, unsigned int imageWidth, unsigned int imageHeight, unsigned int frameIndex)
{
PBITMAPINFO pTempBmpInfo = NULL;
DWORD timespan;
int temp;
if ((IMAGE_WIDTH==imageWidth)&&(IMAGE_HEIGHT==imageHeight))
{
frameNum++ ;
}
timespan = 1000/15;
DWORD diff = GetTickCount() - tickes[frameIndex];//lvm4;
tickes[frameIndex]=GetTickCount();
if (g_threadMarkedForStop[frameIndex] == TRUE)
{
return;
}
if(diff < timespan)
{
Sleep(diff);
}
if (FALSE == ::IsWindow(hWndDisplay[frameIndex]))
{
g_threadMarkedForStop[frameIndex] = TRUE
return;
}
pTempBmpInfo = &m_bmpinfo[frameIndex];
if(pTempBmpInfo != NULL)
{
pTempBmpInfo->bmiHeader.biWidth= imageWidth ;
pTempBmpInfo->bmiHeader.biHeight= imageHeight;
}
else
{
g_threadMarkedForStop[frameIndex] = TRUE;
return;
}
m_hdc = ::GetDC(hWndDisplay[frameIndex]);
::SetStretchBltMode(m_hdc,STRETCH_DELETESCANS);
if (true == fullscreen) ::StretchDIBits(m_hdc,0,0,510,320,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY);
else
{ ::StretchDIBits(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY);
//::SetDIBitsToDevice(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,0,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS);
}
::ReleaseDC(hWndDisplay[frameIndex],m_hdc);
}
이 문제를 해결하는 데 도움을주십시오.
해당 스 니펫에는 명백한 누수가 없습니다. 왜 m_hdc가 당신 클래스의 멤버입니까? 그건 옳지 않아. –
답장을 보내 주셔서 감사합니다. 음 m_hdc는 전 세계적으로 정의 된 HDC 유형의 핸들입니다. 왜 이것이 옳지 않다고 생각하는지 자세히 설명해 주시겠습니까? –
나는 Hans의 요점은 dc가 더 이상 필요하지 않은 즉시 사용 및 폐기되어야한다는 것이 었습니다. 그것들은 메모리/리소스를 소비하고 있으며, 선택된 BMP는 삭제 될 수 없기 때문에 거짓말을하는 것은 일반적으로 잘못된 습관입니다. –