556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1

memory leak on WM_PAINT

20.08.2009, 13:58. Показов 1581. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
сразу подробный упрощенный пример. на данной машине использую VC6++. Windows NT. но созданный exe на xp ведет себя аналогично.

создаем Win32 application. выбираем "hello world".
единственное, что там дописываем, это следующую ф-ю:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void    paint (HDC hdc, RECT *pRECT){
    HDC         hDCMemory;
    HBITMAP     hBmpMemory;
    HBITMAP     hOldMemBmp = NULL;
 
    try {
 
        TCHAR szHello[MAX_LOADSTRING];
        LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
 
        hDCMemory = ::CreateCompatibleDC (hdc);
 
        // create bitmap for paint
        hBmpMemory = (HBITMAP)::CreateCompatibleBitmap(hdc, pRECT->right-pRECT->left, pRECT->bottom-pRECT->top);
        if (hBmpMemory == NULL){
            ::MessageBox (NULL, "Could not create bmp", "ASSERT", MB_OK|MB_TASKMODAL);
            ::DeleteDC(hDCMemory);           // can be skiped, will be done by destructor
            return;
        }
        hOldMemBmp = (HBITMAP)::SelectObject(hDCMemory, hBmpMemory);
 
        DrawText( hDCMemory, szHello, strlen(szHello), pRECT, DT_CENTER );
 
        ::BitBlt (hdc, 0, 0, pRECT->right-pRECT->left, pRECT->bottom-pRECT->top, hDCMemory, 0, 0, SRCCOPY);
        
        // clear resource
        if (hOldMemBmp != NULL) {
            ::SelectObject( hDCMemory, hOldMemBmp );
        }
 
        // restore dc
        ::DeleteObject(hBmpMemory);      // can be skiped, will be done by destructor
        ::DeleteDC(hDCMemory);           // can be skiped, will be done by destructor
    } catch (...){
        ::MessageBox (NULL, "Exception in paint", "ASSERT", MB_OK|MB_TASKMODAL);
    }
}
, которую и вызываем из WinProc():

C++
1
2
3
4
5
6
7
8
9
10
11
12
        case WM_PAINT:
            hdc = BeginPaint (hWnd, &ps);
            // ZU ERLEDIGEN: Hier beliebigen Code zum Zeichnen hinzufügen...
            RECT rt;
            GetClientRect( hWnd, &rt );
            
 
            [COLOR="Blue"][B][SIZE="4"]paint (hdc, &rt);[/SIZE][/B][/COLOR]
 
 
            EndPaint( hWnd, &ps );
            break;
кроме того, класс регистрируем вот такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ATOM MyRegisterClass( HINSTANCE hInstance )
{
    WNDCLASSEX wcex;
 
    wcex.cbSize = sizeof(WNDCLASSEX); 
    wcex.style          = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    = (WNDPROC)wndProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = NULL;
    wcex.hCursor        = NULL;
    wcex.hbrBackground  = (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = szWindowClass;
    wcex.hIconSm        = NULL;
 
    return RegisterClassEx(&wcex);
}
, и окно создаем вот такое:

C++
1
2
   hWnd = CreateWindow(szWindowClass, szTitle, WS_POPUP,
      20, 20, 300, 200, NULL, NULL, hInstance, NULL);
это все, кажется. запускаем, открываем Task Manager, смотрим сколько требуется памяти. перекрываем наше окошко чем-нибудь, опять открываем, чтобы оно перерисовалось, и видим, что память занимаемая добавилась. чтобы не мучиться, можно "автоматизировать" перерисовку:

C++
1
2
3
   ::SetTimer (hWnd, 1, 2000, NULL);
   ShowWindow( hWnd, nCmdShow );
   UpdateWindow( hWnd );
+
C++
1
2
3
4
        case WM_TIMER:
            GetClientRect( hWnd, &rt );
            ::InvalidateRect (hWnd, &rt, FALSE);
            break;
причем сразу после запуска увеличение занимаемой памяти происходит быстро большими кусками, а потом замедляется. за ночь "само" набежало около 20 кб.

есть какие-нибудь идеи?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.08.2009, 13:58
Ответы с готовыми решениями:

Memory leak
Здравствуйте! Люди, очень интересная проблема возникла у моего друга. Программа считывает с файла данные точек и фэйсов и затем рисует...

Memory leak
Здравствуйте, столкнулся с такой проблемой. Растет память приложения, причем не сразу, а по событию. Использовал сначала valgrind, но он...

Memory leak in the SharedPtr C++98
Стандарт С++98. Задача: реализовать свой SharedPtr (не шаблонный). Всю ночь просидел вылизывая код, но даже сейчас мне приходит отчёт об...

8
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
20.08.2009, 15:22
novi4ok, можешь прикрепить проект? Лень самому собирать
По описанию похоже на невызванные функции освобождения хэндлов,но на первый взгляд вроде все есть. А второй взгляд я у себя из студии делать буду )
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
20.08.2009, 15:24  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
novi4ok, можешь прикрепить проект? Лень самому собирать
По описанию похоже на невызванные функции освобождения хэндлов,но на первый взгляд вроде все есть. А второй взгляд я у себя из студии делать буду )
XuTPbIu_MuHTAu, спасибо за желание помочь. но как прикрепить? никогда не делал

PS. растет только количество используемой памяти. количество используемых хэндлов и GDI-объектов остается постоянным. потому и кажется странным такое поведение.
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
20.08.2009, 15:35  [ТС]
TestPaint.ZIP
нашел. может сработает?
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
21.08.2009, 12:28
Цитата Сообщение от novi4ok Посмотреть сообщение
Вложение 9009
нашел. может сработает?
Компильнул твой проект под VS 2008. Память не растет, утечек кучи нет....
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
21.08.2009, 12:28
Code
1
2
hDCMemory = ::CreateCompatibleDC (hdc);
                ::DeleteDC(hDCMemory);
Если в вызове paint оставить только эти две функции, счетчик будет тикать. Пока все,что установил,попозже еще посмотрю
1
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2009, 15:46  [ТС]
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Code
1
2
hDCMemory = ::CreateCompatibleDC (hdc);
                ::DeleteDC(hDCMemory);
Если в вызове paint оставить только эти две функции, счетчик будет тикать. Пока все,что установил,попозже еще посмотрю
then it seems that there is no way to avoid this strange behavior...
0
1 / 1 / 0
Регистрация: 24.08.2009
Сообщений: 4
07.09.2009, 19:04
Попробуй юзать какие-нибудь утилиты для поиска утечек памяти, например: Deleaker
1
 Аватар для snake32
3516 / 1699 / 236
Регистрация: 26.02.2009
Сообщений: 8,536
Записей в блоге: 6
07.09.2009, 19:59
Цитата Сообщение от Patison Посмотреть сообщение
Попробуй юзать какие-нибудь утилиты для поиска утечек памяти
А есть бесплатные?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.09.2009, 19:59
Помогаю со студенческими работами здесь

Таймер GUI. Memory leak, растет размер процесса
Приветствую форумчан! В кьюте только начинаю разбираться. Написан простой ГУИ таймер. При закрытии окна (досрочно, если время...

memory leak или "ОС подчистит" (Знакомство с Modern C++ Design\Loki Александреску приветствуется)
Доброго времени суток, уважаемые. Возможно мой вопрос покажется вам несколько странным, однако мне бы хотелось внести у себя в голове...

Create an in memory bitmap and draw directly to the memory
Здравствуйте! У меня есть пара вопросов. Знаю, что рисовать в HDC можно только с одного потока. Но узнал такую вещь, что можно создать...

Memory leak
Всем добрый день! Господа знатоки, подскажите пожалуйста, столкнулся со следующей проблемой: При помощи API вендора получаю с...

Memory leak
Здравствуйте, коллеги. В программе наблюдается утечка памяти. Наблюдается совершенно четко - пользовал CLR Profiler и PerfMon. Код не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru