Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка памяти 
:(
    Опции темы
leopard678
Дата 17.11.2006, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



Что приводит к утечке памяти?

Код

void CSimpleButton::Draw(HDC pDC)
{
    dcMem1 = CreateCompatibleDC(pDC);

    //--выбор изображения кнопки
    switch(m_iState) 
    {
        case 0:
            {
                 SelectObject(dcMem1,m_hbBMP_Disable);
                break;
            }
        case 1:
            {
                SelectObject(dcMem1,m_hbBMP_Normal);
                break;
            }
        case 2:
            {
                SelectObject(dcMem1,m_hbBMP_HighLight);
                break;
            }
        case 3:
            {
                SelectObject(dcMem1,m_hbBMP_Push);
                break;
            }        
        default:   // если значение состояния вне допустимого - ничего не рисуем
            {

                break;
            }        
    }
    BitBlt(pDC,m_iX,m_iY,m_iCX,m_iCY,dcMem1,0,0,SRCCOPY);

    ::DeleteDC(dcMem1);

}

PM MAIL   Вверх
leopard678
Дата 17.11.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



Если вместо BitBlt(pDC,m_iX,m_iY,m_iCX,m_iCY,dcMem1,0,0,SRCCOPY);
использовать:
Код

COLORREF clSrc;
    for(int x=0; x<nWidth; x++)
        for(int y=0; y<nHeight; y++)
        {
        
            // получаем цвет пикселя источника
            clSrc=GetPixel(hdcSrc,nXSrc+x,nYSrc+y);            
            // если цвет источника не соответствует цвету прозрачности...
        //    if(clSrc!=ColorX) 
        //    {    //...то меняем пиксель в приёмнике
                SetPixel(hdcDest, nXDest+x, nYDest+y, clSrc);
        //    }
            
        } 


то утечки нет, но работает медленней... smile 
PM MAIL   Вверх
JackYF
Дата 17.11.2006, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Как ты определяешь утечку? И где конкретно она происходит?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
leopard678
Дата 17.11.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



Я её вижу в диспетчере задач  Windows ...
если вношу изменения описанные выше...то её нет...
PM MAIL   Вверх
Aleksandor
Дата 17.11.2006, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



Во втором случае не используется hdcMem и bitmap, наверное стоит копать в ту сторону smile  
если битмапы создаются каждый раз заново, то их надо удалять, из текста не видно откуда они берутся. у меня вот такой код - работает нормально. ТТТ
Код

hdcMem = CreateCompatibleDC(lpdis->hDC); 
hbmOld = (HBITMAP) SelectObject(hdcMem, hbm[i]); 
BitBlt(lpdis->hDC,  lpdis->rcItem.left, y, 16, 16, hdcMem, 0, 0, SRCCOPY); 

SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem); 



--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
leopard678
Дата 17.11.2006, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



bitmap создаются при содзпнии класса из рессурсов..
hbmOld не помогает  smile 
PM MAIL   Вверх
Aleksandor
Дата 17.11.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Практик
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 22.11.2005
Где: россия, зеленогра д

Репутация: 10
Всего: 12



А если без класса попробовать? Хорошо бы BoundsChecker еще задействовать для отладки. Или на худой конец полностью код в студию  smile 


--------------------
Call out Gouranga be happy!!!
Gouranga Gouranga Gouranga ....
That which brings the highest happiness!!
PM MAIL   Вверх
leopard678
Дата 20.11.2006, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



главное окно:
Код

case WM_PAINT:
            {
                hdc = BeginPaint(hWnd, &ps);        
                    paint(hdc);
                EndPaint(hWnd, &ps);                
                
                break;
            }


Код

CSimpleButton sbOptions;
.............
sbOptions.SetBMP(hInst,IDB_BOPTIONS_NORMAL,IDB_BOPTIONS_HIGHLIGHT,IDB_BOPTIONS_HIGHLIGHT,IDB_BOPTIONS_DISABLE);
        sbOptions.SetPosition(30,325);
        sbOptions.SetSize(225,44);
        sbOptions.SetState(BT_NORMAL);
.............
void paint(HDC hdc)
{    
                fon=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_FON));
                
                d=CreateCompatibleDC(hdc);
                PatBlt(d,0,0,640,480,WHITENESS);
                SelectObject(d,fon);

                sbOptions.Draw(d);

                BitBlt(hdc,0,0,640,480,d,0,0,SRCCOPY);
                DeleteDC(d);
                
          
}


класс кнопки
Код

//---Установка Изображений(из ресурсов) на кнопке----------------------------//
void CSimpleButton::SetBMP(HINSTANCE a_hinstance_app, WORD a_strBMP_Normal, WORD a_strBMP_HighLight, WORD a_strBMP_Push, WORD m_strBMP_Disable)
{
     m_hbBMP_Normal=LoadBitmap(a_hinstance_app,MAKEINTRESOURCE(a_strBMP_Normal));
     m_hbBMP_HighLight=LoadBitmap(a_hinstance_app,MAKEINTRESOURCE(a_strBMP_HighLight));
     m_hbBMP_Push=LoadBitmap(a_hinstance_app,MAKEINTRESOURCE(a_strBMP_Push));
     m_hbBMP_Disable=LoadBitmap(a_hinstance_app,MAKEINTRESOURCE(m_strBMP_Disable));
     
}


Код

void CSimpleButton::Draw(HDC pDC)
{
    dcMem1 = CreateCompatibleDC(pDC);
    HBITMAP hOldbm;

    //--выбор изображения кнопки
    switch(m_iState) 
    {
        case 0:
            {
                // Выбираем изображение bitmap в контекст памяти
                 hOldbm = (HBITMAP)SelectObject(dcMem1,m_hbBMP_Disable);
                break;
            }
        case 1:
            {
                // Выбираем изображение bitmap в контекст памяти
                 hOldbm = (HBITMAP)SelectObject(dcMem1,m_hbBMP_Normal);
                break;
            }
        case 2:
            {
                // Выбираем изображение bitmap в контекст памяти
                 hOldbm = (HBITMAP)SelectObject(dcMem1,m_hbBMP_HighLight);
                break;
            }
        case 3:
            {
                // Выбираем изображение bitmap в контекст памяти
                 hOldbm = (HBITMAP)SelectObject(dcMem1,m_hbBMP_Push);
                break;
            }        
        default:   // если значение состояния вне допустимого - ничего не рисуем
            {

                break;
            }        
    }

    if (hOldbm)
    {
        BitBlt(pDC,m_iX,m_iY,m_iCX,m_iCY,dcMem1,0,0,SRCCOPY);

        // Восстанавливаем контекст памяти
        SelectObject(dcMem1, hOldbm);
    }


        ::DeleteDC(dcMem1);
        
}

PM MAIL   Вверх
leopard678
Дата 20.11.2006, 08:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 16.8.2006

Репутация: нет
Всего: нет



Похоже проблема была в
Код

void paint(HDC hdc)
{    
                fon=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_FON));


только не понятно почему при выводе не через BitBlt ,а через GetPixel, SetPixel всё работало нормально....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0553 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.