Ошибка освобождения памяти?
Мне нужно освободить 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) );
В противном случае вы создаете растровые изображения и не удаляете их.