「已注销」 2021-04-04 09:00 采纳率: 50%
浏览 80
已采纳

CreateCompatibleDC返回NULL如何处理

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;
  • 写回答

4条回答 默认 最新

  • 关注

    有没有可能内存不足的情况呢?因为分配过多,没有释放导致

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 关于大棚监测的pcb板设计
  • ¥20 sim800c模块 at指令及平台
  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计