king110_1 2023-03-17 12:22 采纳率: 25%
浏览 14
已结题

释放内存失败,位图DC为什么不能释放

我做了个查看位图的程序,每次换图时需要把前一图申请的内存释放掉,但是每次free完就产生异常

if (data != NULL)
                {
                    DeleteObject(hBit);
                    ReleaseDC(hWnd,memDC); //并不能释放DC,每次返回的都是0
                    ReleaseDC(hWnd,winDC);
                    DeleteObject(memDC); //只有这样才能释放
                    free(data); //产生异常
                }
                szFile = OpenBmp(hWnd);
                if (szFile != NULL)
                {
                    wcscpy_s(fName, lstrlen(szFile) * 2, szFile);
                }
                else
                    return NULL;
                hFile = CreateFile(fName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
                R = ReadFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &num, NULL);
                if (R)
                {
                    R = ReadFile(hFile, &fif, sizeof(BITMAPINFOHEADER), &num, NULL);
                    winDC = GetDC(hWnd);
                    memDC = CreateCompatibleDC(winDC);
                    GetClientRect(hWnd, &rect);
                    dataSize = bfh.bfSize - bfh.bfOffBits;
                    data = (BYTE*)malloc(dataSize);

                    pbmi.bmiHeader = fif;
                    width = fif.biWidth;
                    height = fif.biHeight;

                    hBit = CreateDIBSection(memDC, &pbmi, DIB_RGB_COLORS, (void**)&data, NULL, 0);
                    R = ReadFile(hFile, data, dataSize, &num, NULL);
                    SelectObject(memDC, hBit);
                    open = TRUE;
                    InvalidateRect(hWnd, &rect, TRUE);

                }
                CloseHandle(hFile);

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-17 12:35
    关注

    看看句柄是否有效,是否已经释放过了

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月24日
  • 修改了问题 3月17日
  • 创建了问题 3月17日