Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
#1

memory leak on WM_PAINT - Visual C++

20.08.2009, 13:58. Просмотров 1114. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2009, 13:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос memory leak on WM_PAINT (Visual C++):

WM_PAINT для дочерних диалогов - Visual C++
Вот, столкнулся с проблемой. Есть у меня главный немодальный диалог (с меню). В него вставляются 3 дочерних немодальных окна (каждое из...

Помогите с MFC. Не могу разобраться с WM_PAINT - Visual C++
Здраствуйте. Если я провожу по окну своей программы другим окном то стираются все кнопки, поля ввода и тд, кроме картинки, которую я...

CDialog::PumpMessage виснет (бесконечный WM_PAINT?) - Visual C++
У меня есть следующая странная проблема на компьютере заказчика (куда я не имею доступа): OS: WinXP Приложение: MFC приложение Visual...

out of memory Visual C++ 6 - Visual C++
Есть прога, в консоли работает. Перенесли в кнопку диалогового окна, появилась ошибка out of memory. Ошибка появляется при выделении памяти...

Shared memory - Visual C++
Микроконтроллер загружает необходимую информацию в shared memory по заранее известным адресам. Как считать/получить доступ к этой инфе из...

Ошибка: Out of memory. /LARGEADDRESSAWARE - C++
Добрый день. Возникла такая проблема: есть приложения в которой строиться отчет и отчет съедает много памяти > 4gb. Флаг компилятора...

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

PS. растет только количество используемой памяти. количество используемых хэндлов и GDI-объектов остается постоянным. потому и кажется странным такое поведение.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
20.08.2009, 15:35  [ТС] #4
TestPaint.ZIP
нашел. может сработает?
0
solar_wind
760 / 751 / 42
Регистрация: 06.07.2009
Сообщений: 2,988
Завершенные тесты: 1
21.08.2009, 12:28 #5
Цитата Сообщение от novi4ok Посмотреть сообщение
Вложение 9009
нашел. может сработает?
Компильнул твой проект под VS 2008. Память не растет, утечек кучи нет....
0
XuTPbIu_MuHTAu
Эксперт С++
2234 / 749 / 10
Регистрация: 27.05.2008
Сообщений: 1,498
21.08.2009, 12:28 #6
Код
hDCMemory = ::CreateCompatibleDC (hdc);
                ::DeleteDC(hDCMemory);
Если в вызове paint оставить только эти две функции, счетчик будет тикать. Пока все,что установил,попозже еще посмотрю
1
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
21.08.2009, 15:46  [ТС] #7
Цитата Сообщение от XuTPbIu_MuHTAu Посмотреть сообщение
Код
hDCMemory = ::CreateCompatibleDC (hdc);
                ::DeleteDC(hDCMemory);
Если в вызове paint оставить только эти две функции, счетчик будет тикать. Пока все,что установил,попозже еще посмотрю
then it seems that there is no way to avoid this strange behavior...
0
Patison
1 / 1 / 0
Регистрация: 24.08.2009
Сообщений: 4
07.09.2009, 19:04 #8
Попробуй юзать какие-нибудь утилиты для поиска утечек памяти, например: Deleaker
1
snake32
1639 / 1093 / 160
Регистрация: 26.02.2009
Сообщений: 4,040
Записей в блоге: 5
07.09.2009, 19:59 #9
Цитата Сообщение от Patison Посмотреть сообщение
Попробуй юзать какие-нибудь утилиты для поиска утечек памяти
А есть бесплатные?
0
07.09.2009, 19:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2009, 19:59
Привет! Вот еще темы с ответами:

Creating Named Shared Memory - Visual C++
Здравствуйте. Пытаюсь освоить работу с общей памятью двух разных программ, используя FileMapping, всё делаю как в ссылке, но в первой...

Run exe from memory (x64) - C++
Есть необходимость запускать exe из памяти, а не с диска. Может кто сталкивался с данным проектом? Сам находил много проектов, но они...

Ошибка 2064, ссылающаяся на библиотеку memory - C++
Вопрос адресуется тем, кто хорошо знает библиотеку memory, или же сталкивался с подобной ошибкой. Почему именно так: проект довольно...

Ошибки 2064 и 2664, ссылающиеся на библиотеку memory - C++
Здравствуйте, программисты! Преобразовала проект на Java с сырыми указателями на с++ с использованием shared_ptr. Выдает мне 6 ошибок,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru