![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Утечка памяти в CreateDIBSection
Я © (2011-11-18 15:06:00)Доброго времени суток. Помогите плз найти ошибки.
typedef unsigned char byteW,*PbyteW;
RECT R;
GetWindowRect(Wnd, &R);
int W = R.right - R.left;
int H = R.bottom - R.top;
//////////////////////////////////////
BITMAPINFO* bm_info = new BITMAPINFO;
bm_info->bmiHeader.biSize = 40;
bm_info->bmiHeader.biSizeImage = 0;
bm_info->bmiHeader.biWidth = W;
bm_info->bmiHeader.biHeight = -H;
bm_info->bmiHeader.biPlanes = 1;
bm_info->bmiHeader.biBitCount = 32;
bm_info->bmiHeader.biCompression = BI_RGB;
////////////////////////////////////////////
HDC DC = GetWindowDC(Wnd);
HDC memDC = CreateCompatibleDC(DC);
PbyteW ptrbf = new byteW [W* H*4];
HBITMAP bm = CreateDIBSection(memDC, bm_info, DIB_RGB_COLORS, (void**)&ptrbf, NULL, NULL);
// HBITMAP bm = CreateCompatibleBitmap(DC, W, H);
HBITMAP oldBM = (HBITMAP) SelectObject(memDC, bm);
BitBlt(memDC, 0,0, W, H, DC, 0,0, SRCCOPY);
SelectObject(memDC, oldBM);
DeleteDC(memDC);
DeleteObject(oldBM);
ReleaseDC(Wnd, DC);
delete[] ptrbf;
Я (2011-11-19 09:49:00) [1]Собсно нашел робочий пример. Вот он (с небольшой редакцией)
HBITMAP hbitmap;
HGDIOBJ hold_bitmap;
BITMAPINFO bmi;
VOID *pvbits;
RECT r;
GetClientRect(Wnd, &r);
HDC hdc = GetDC(Wnd);
int h = (r.bottom - r.top);
int w = r.right - r.left;
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biHeight = - h;
bmi.bmiHeader.biWidth = w;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = bmi.bmiHeader.biHeight * bmi.bmiHeader.biWidth * 4;
HDC hdc2 = CreateCompatibleDC(NULL);
hbitmap = CreateDIBSection(NULL,&bmi,DIB_RGB_COLORS,&pvbits,NULL,0x0);
hold_bitmap = SelectObject(hdc2,hbitmap);
BitBlt(hdc2, 0,0, w, h,hdc, 0,0, SRCCOPY);
for(int y=0; y
Rouse_ (2011-11-18 17:49:00) [2]Не, бред какой-то получается...
если bm_info и bm удаляешь утечек ни по памяти ни по GDI ресурсам не видно...
Rouse_ (2011-11-18 17:37:00) [3]Выпимши правда уже, но:
(void**)&ptrbf
Це ж не указатель на адрес буфера, а указатель на указатель - не?
Я (2011-11-18 17:07:00) [4]Уже проверил. Вроде как нет :)
Омлет (2011-11-18 17:03:00) [5]Может, еще что-то забыл перенести?
Я (2011-11-18 16:34:00) [6]delete[] bm_info;
Так же не решает проблемы. Эти две операции у меня в "разрабатываемом" коде были. Это я в сабжевый "локализованный" забыл их перенести. Sorry
MBo (2011-11-18 16:23:00) [7]а bm_info тоже не удаляется?
Я (2011-11-18 16:02:00) [8]А ну да я это просто забыл
DeleteObject(bm);
перед
ReleaseDC(Wnd, DC);
и все равно растет
MBo (2011-11-18 15:59:00) [9]К утечке отношения не имеет, но вот так поаккуратнее будет:
bm_info->bmiHeader.biSize = sizeof(bm_info)
Я (2011-11-18 15:58:00) [10]
> иь удалять кто будет?
Уточните плз какой ресурс я не освободил
Rouse_ (2011-11-18 15:57:00) [11]блин, пунтосвитчер... "BM" имелось ввиду
Rouse_ (2011-11-18 15:54:00) [12]иь удалять кто будет?