Ошибка освобождения памяти?

Мне нужно освободить bitpointer, потому что эта функция выполняется несколько раз, и использование памяти растет по причине, которую я не понимаю, и происходит сбой после достижения 22 МБ оперативной памяти. Если я пытаюсь удалить bitpointer как это delete []bitpointer или же free(bitpointer)Я получаю ошибку нарушения доступа. Но я не понимаю, почему, потому что функция больше не должна использовать указатель и установлены новые значения красного, синего и зеленого цветов.

void Get_Color(int x,int y,int w,int h,int &red,int &green,int &blue,int action)
{
    HDC hdc, hdcTemp;
    RECT rect;
    BYTE*bitPointer=new BYTE[4*h*w];
    HWND Desktop = GetDesktopWindow();
    hdc = GetDC(Desktop);
    GetWindowRect(Desktop, &rect);
    hdcTemp = CreateCompatibleDC(hdc);
    BITMAPINFO bitmap;
    bitmap.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bitmap.bmiHeader.biWidth = w;
    bitmap.bmiHeader.biHeight = h;
    bitmap.bmiHeader.biPlanes = 1;
    bitmap.bmiHeader.biBitCount = 32;
    bitmap.bmiHeader.biCompression = BI_RGB;
    bitmap.bmiHeader.biSizeImage = 0;
    bitmap.bmiHeader.biClrUsed = 0;
    bitmap.bmiHeader.biClrImportant = 0;
    HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
    SelectObject(hdcTemp, hBitmap2);
    BitBlt(hdcTemp, 0, 0, w, h, hdc, x, y, SRCCOPY);
    if(action==1)
    {
        for(int j=0;j<=w*h*4;j+=4)
        {
            red = bitPointer[j+2];
            green = bitPointer[j+1];
            blue = bitPointer[j];
            if(red<30 && green>190 && blue>190)
            {
                break;
            }
        }   
    }
    else
    {
        for(int j=0;j<=w*h*4;j+=4)
        {
            red = bitPointer[j+2];
            green = bitPointer[j+1];
            blue = bitPointer[j];
            break;

        }   
    }
    ///RELEASE
    ReleaseDC(NULL,hdc);
    ReleaseDC(NULL,hdcTemp);
    delete []bitPointer; ///Error
}

2 ответа

Если вы прочитаете документацию, вы увидите, что вам не следует выделять память для bitPointer, CreateDIBSection делает это для вас. Вам нужно использовать DeleteObject чтобы бесплатно hBitmap2,

Сбой происходит потому, что значение bitPointer вы освобождаете не тот, кого вы выделили. (И память, которую вы распределили, просочилась.)

В SelectObject сохраните возвращенное значение: HGDIOBJ save = SelectObject(hdcTemp, hBitmap2);

Затем перед ReleaseDC удалите DIB DeleteObject( SelectObject(hdcTemp, save) );

В противном случае вы создаете растровые изображения и не удаляете их.

Другие вопросы по тегам