Russian Qt Forum
Октябрь 03, 2024, 14:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [решено] Утечка в WinXP: есть или нету?  (Прочитано 4532 раз)
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« : Апрель 27, 2010, 12:31 »

Программа постоянно создаёт объекты (не автоматические, через new), каждый из которых при завершении своей работы удаляется. Удаляется 100%, т.к. объект слишком прост, чтобы что-то упустить. Всё бы ничего, но виндовый диспетчер показывает, что память всё равно, хоть и медленно, но растёт. И что самое интересное - если свернуть/развернуть приложение в панель задач, то память резко чистится. Т.е. если доросла, напр., до 100mb то после свёртывания/развёртывания - 20mb. Причём следующие разы эту процедуру можно не проделывать - утечки (если это, конечно, она) уже не будет. Я понимаю, что виндовый диспетчер не показатель, но всё же. Может кто-то знает ответ?
« Последнее редактирование: Апрель 27, 2010, 20:17 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
garryHotDog
Гость
« Ответ #1 : Апрель 27, 2010, 13:22 »

Утечка какой памяти виртуальной или оперативной?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #2 : Апрель 27, 2010, 13:22 »

оперативной
Записан

kubuntu/Win7/x64/NetBeans
garryHotDog
Гость
« Ответ #3 : Апрель 27, 2010, 13:24 »

работа с сокетами или потоками есть?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #4 : Апрель 27, 2010, 13:33 »

работа с сокетами или потоками есть?
с потоками да. Создаётся объект потока, он делает что надо, при окончании работы посылает сигнал на удаление себя же (в главный поток, который его создал), и, соответственно, удаляется.
Записан

kubuntu/Win7/x64/NetBeans
mal
Гость
« Ответ #5 : Апрель 27, 2010, 13:36 »

если юзаешь Visual Studio - посмотри тут

http://www.prog.org.ru/topic_13305_0.html

чтоб быть уверенным что все удаляешь. Если что-то  все же не удаляешь - найдешь стопудово.
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #6 : Апрель 27, 2010, 13:36 »

не, не юзаю. Если бы я что-то не удалял, то после сворачивания/разворачивания окна память не чистилась бы о_О.
Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...
« Последнее редактирование: Апрель 27, 2010, 13:56 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
garryHotDog
Гость
« Ответ #7 : Апрель 27, 2010, 16:33 »

попробуй при создании потока соединить его на "самоуничтожение"

Код:
// создаем поток.
QMyThread newThread=new QMyThread(this);
// инициализируем параметры.
newThread.Initialize( FirstParam, SecondParams );
// коннектимся.
connect( newThread, SIGNAL(finished()), newThread, SLOT(deleteLater()) );

память будет освобождена по завершению потока 100%
« Последнее редактирование: Апрель 27, 2010, 16:44 от garryHotDog » Записан
spectre71
Гость
« Ответ #8 : Апрель 27, 2010, 18:27 »

Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...

Нет ничего странного!
Объекты в куче создаются/освобождаются.
ОС выделяет память приложению постранично.
Если приложению необходимо выделить память N байт, то просматриваются уже отданные приложению страницы на предмет минимального непрерывного свободного куска памяти как минимум в N байт. В случае если такого куска нет, то запрашивается новая страница! Поскольку объекты создаются/удаляются, то выделенные страницы памяти могут фрагментироваться и для нового объекта может не найтись свободного непрерывного куска памяти в N байт в уже выделенных страницах, хотя общая сумма свободной памяти в этих страницах может быть гораздо больше. Как правило через некоторое время все уравновешивается, даже при очень интенсивном создании/удалении объектов (если их максимальное число не нарастает, и они одни и те же). Поэтому, некоторое время память будет кушаться(сколько зависит от конкретной прозраммы итд.), а дальше может и престать(если нет утечки).
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #9 : Апрель 27, 2010, 19:58 »

Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...

Нет ничего странного!
Объекты в куче создаются/освобождаются.
ОС выделяет память приложению постранично.
Если приложению необходимо выделить память N байт, то просматриваются уже отданные приложению страницы на предмет минимального непрерывного свободного куска памяти как минимум в N байт. В случае если такого куска нет, то запрашивается новая страница! Поскольку объекты создаются/удаляются, то выделенные страницы памяти могут фрагментироваться и для нового объекта может не найтись свободного непрерывного куска памяти в N байт в уже выделенных страницах, хотя общая сумма свободной памяти в этих страницах может быть гораздо больше. Как правило через некоторое время все уравновешивается, даже при очень интенсивном создании/удалении объектов (если их максимальное число не нарастает, и они одни и те же). Поэтому, некоторое время память будет кушаться(сколько зависит от конкретной прозраммы итд.), а дальше может и престать(если нет утечки).

Ясно, очень полезно, спасибо!
Записан

kubuntu/Win7/x64/NetBeans
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #10 : Апрель 27, 2010, 21:33 »

Эх, найти бы ещё где-нибудь толковую статейку по возможностям Qt. Т.е. какие операции трудоёмки, а какие нет, в каких ситуациях что предпочтительней использовать в целях экономии времени и ресурсов системы. Мне, например, интересно тяжёлы ли для софтины сигналы/слоты или не очень. Речь идёт именно о больших нагрузках, сотни потоков, каждый из которых использовал бы их к примеру.
« Последнее редактирование: Апрель 27, 2010, 21:35 от serg_hd » Записан

kubuntu/Win7/x64/NetBeans
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.153 секунд. Запросов: 23.