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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ImageList и освобождение памяти 
:(
    Опции темы
Letchik
Дата 1.6.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет!
У меня к вам просьба!
Объясните пожалуйста, почему после закрытия диалогового окна память не освобождается? Правда есть плюс, после повторного его открытия, память заново не выделяется.
А вот очень важная проблема: в диалоговом окне есть массив из ImageList"ов. Создаю с помощью ImageList_Create(), а в обработчике WM_DESTROY удаляю их всех с помощью ImageList_Destroy. Однако память после них не освобождается. Мало того, с каждым открытием окна память под них только выделяется.
Проверил, это именно ImageList!
Количество выделяемой памяти наблюдаю в диспетчере задач.
В чём дело? 
Чего я не знаю?
PM MAIL Skype   Вверх
Alca
Дата 1.6.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



 smile  где код?


Это сообщение отредактировал(а) Alca - 1.6.2010, 10:43


--------------------
PM WWW ICQ Skype Jabber   Вверх
Letchik
Дата 1.6.2010, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

    case WM_CREATE:
               /*.....some code....*/   
                    
        BUTTON_IMAGELIST btimg;                         //Параметры отображения иконок на кнопках
        btimg.margin.left = 20;
        btimg.margin.top = 0;
        btimg.margin.right = -25;
        btimg.margin.bottom = 0;
        btimg.uAlign = BUTTON_IMAGELIST_ALIGN_LEFT;                           

         for (int i = 0; i < 4; i++)                 //В цикле подгружаются иконки
        {
            hImgList[i] = ImageList_Create(20, 20, ILC_COLOR32 | ILC_MASK, 1, 0); //Создаём имедэлист
            hIcon = ExtractIcon(hInst, _T("iclib.dll"), i + 6);                                          //Грузим иконку
            ImageList_AddIcon(hImgList[i], hIcon);                                                   //   Добавляем иконку в имиджлист
            btimg.himl = hImgList[i];                                                                          //Ну а тут
            Button_SetImageList(hNContact_Button[i], &btimg);                              //присваиваем иконку кнопке
        }
        
        DeleteObject(hIcon);

                            /*....some code.....*/

        ShowWindow(hNContact, TRUE);
        UpdateWindow(hNContact);
        break;

    case WM_COMMAND:
        
        switch (wParam)
        {
        case IDM_CONTACT_CANCEL:                              //Тут всё ясно
            DestroyWindow(hNContact);
            break;
        }
        break;

    case WM_DESTROY:
        
        for (int i = 0; i < 4 i++)                                         //Цикл для удаления (!) Всех имеющихся имиджлистов
        {
            ImageList_RemoveAll(hImgList[i]);
            ImageList_Destroy(hImgList[i]);
        }
        break;
 
Вот уменьшённая версия кода. Вместо "some code" кое-какие строчки отвечающие за создание контролов, установка шрифтов и тому подобное. С этим проблем нет.

Это сообщение отредактировал(а) Letchik - 1.6.2010, 18:32
PM MAIL Skype   Вверх
xvr
Дата 1.6.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



IMHO тут проблема не в ImageList, а в Icon. В строке 14 создается 4 иконки, а в строке 20 удаляется только одна.

PM MAIL   Вверх
Letchik
Дата 2.6.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я тоже так думал. Чтобы проверить, вставил DeleteObject(hIcon) в цикл. Проблема не решилась.
Потом убрал из цикла все строки кроме   
Код

hImgList[i] = ImageList_Create(20, 20, ILC_COLOR32 | ILC_MASK, 1, 0);
 
Проблема повторилась. Затем убрал всю часть кода, которая отвечала за загрузку картинок, создание имиджлистов и тому подобное.
Результат: память выделялась только при первом открытии диалогового окна.
Вывод: дело в ImageList.
PM MAIL Skype   Вверх
GremlinProg
Дата 2.6.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Letchik @  2.6.2010,  15:40 Найти цитируемый пост)
Я тоже так думал. Чтобы проверить, вставил DeleteObject(hIcon) в цикл. Проблема не решилась.

если иконка не общая(LR_SHARED), ее нужно удалять с помощью DestroyIcon


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 2.6.2010, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



менеджер памяти не охотно хочет уменьшать память кучи после уничтожения Image List с его содержимым.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 3.6.2010, 09:21 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(Dem_max @  2.6.2010,  22:13 Найти цитируемый пост)
менеджер памяти не охотно хочет уменьшать память кучи после уничтожения Image List с его содержимым.

это не проблема кучи,
физическое освобождение памяти происходит только при ее дефиците,
иначе бы все операции с памятью требовали бы гораздо больше времени,
так что в данном случае "невысвобождение памяти" - не показатель

показатель - постоянный рост задействованных ресурсов, т.е. утечка (leak)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Letchik
Дата 3.6.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Диагноз - утечка памяти.
Не пойму, откуда берутся целых 32кб????  И почему память не освобождается после закрытия окна????  smile
Конечно, на практике это никак не отразится на производительности программы, особенно на современных компьютерах. Ведь для того, чтобы в памяти собрался лишний мегабайт мусора нужно открыть окошко 32 раза. Вряд ли такое случится, но тем не менее, мне очень не нравится, что моя прога страдает утечкой памяти...
Неужели никто не сталкивался с данной проблемой???
PM MAIL Skype   Вверх
Dem_max
Дата 4.6.2010, 04:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



у меня та же самая проблема, память выделяется, но диспечер задач показывает как будто она не освободилась. При следующем создании ImageList, память не увеличивается - это не есть утечка памяти. Утечка это когда постоянно память будет увеличиваться.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Letchik
Дата 7.6.2010, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А вот у меня увеличивается...
Покажи код  smile 
PM MAIL Skype   Вверх
Dem_max
Дата 7.6.2010, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Собственно только вот это


Код

hImList = ImageList_Create(cx, cy, ILC_COLOR32 | ILC_MASK, 6, 0);

ImageList_AddIcon(hImList, hIcon); 
ImageList_AddIcon(hImList, hIcon); 
ImageList_AddIcon(hImList, hIcon);  


ImageList_Destroy(hImList);



--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
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.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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