windowsAPI + C语言
反复执行以下代码,其中CreateCompatibleDC有几率返回NULL,此时GetLastError = 0x6,但没找到哪里发生内存泄漏,应该都Delete了,且Delete返回均正常。
此主线程反复执行且只反复执行这些步骤。此时有线程在处理消息循环,且消息循环确保没有问题。CreateCompatibleDC出现错误的时机貌似是随机不确定且不连续的,结束后过一段时间还是会报错
///////////////////////////////////////////////init
BITMAPINFO bmi = {{0}};
VOID* p_bmp_buf;
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height - 1;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biSizeImage = width * height * 4;
m_hdc = CreateCompatibleDC(disapp.m_hdc); //内存泄露可能?
if(m_hdc == NULL)
{
MAKEDEBUG(false, _T("from:(...-sturct tagIMAGE-newImage-sign2)\ninf: api_err 0x%x (see CreateCompatibleDC)"), GetLastError());
return DEM_WINAPI;
}
m_pBitmap = CreateDIBSection(disapp.m_hdc, &bmi, DIB_RGB_COLORS, (VOID**)&p_bmp_buf, NULL, 0);
if(m_pBitmap == NULL)
{
int err = GetLastError();
DeleteDC(m_hdc);
MAKEDEBUG(false, _T("from:(...-sturct tagIMAGE-newImage-sign3)\ninf: api_err 0x%x (see CreateDIBSection)"), err);
return DEM_WINAPI;
}
g_hbmp_def = (HBITMAP)SelectObject(m_hdc, m_pBitmap); //以备清空内存
text_font = (HFONT)GetCurrentObject(m_hdc, OBJ_FONT);
m_buffer = (PDWORD)p_bmp_buf;
text_setfontf(20, 10);
SetBkMode(m_hdc, TRANSPARENT);
////////////////////////////////////////////////////reset
if(m_hdc != NULL)
{
if(DeleteObject(SelectObject(m_hdc, g_hbmp_def)) == 0) MAKEDEBUG(false, "??1");
// if(DeleteObject(m_pBitmap) == 0) MAKEDEBUG(false, "??2");
if(DeleteObject(text_font) == 0) MAKEDEBUG(false, "??3");
if(DeleteDC(m_hdc) == 0) MAKEDEBUG(false, "??4");
}
g_hbmp_def = NULL;
text_font = NULL;
m_hdc = NULL;
m_pBitmap = NULL;
m_buffer = NULL;