Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Утечка памяти в 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]

иь удалять кто будет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо