Russian Qt Forum

Qt => Общие вопросы => Тема начата: serg_hd от Апрель 27, 2010, 12:31



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


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: garryHotDog от Апрель 27, 2010, 13:22
Утечка какой памяти виртуальной или оперативной?


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: serg_hd от Апрель 27, 2010, 13:22
оперативной


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: garryHotDog от Апрель 27, 2010, 13:24
работа с сокетами или потоками есть?


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: serg_hd от Апрель 27, 2010, 13:33
работа с сокетами или потоками есть?
с потоками да. Создаётся объект потока, он делает что надо, при окончании работы посылает сигнал на удаление себя же (в главный поток, который его создал), и, соответственно, удаляется.


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: mal от Апрель 27, 2010, 13:36
если юзаешь Visual Studio - посмотри тут

http://www.prog.org.ru/topic_13305_0.html
 (http://www.prog.org.ru/topic_13305_0.html)
чтоб быть уверенным что все удаляешь. Если что-то  все же не удаляешь - найдешь стопудово.


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: serg_hd от Апрель 27, 2010, 13:36
не, не юзаю. Если бы я что-то не удалял, то после сворачивания/разворачивания окна память не чистилась бы о_О.
Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: garryHotDog от Апрель 27, 2010, 16:33
попробуй при создании потока соединить его на "самоуничтожение"

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

память будет освобождена по завершению потока 100%


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: spectre71 от Апрель 27, 2010, 18:27
Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...

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


Название: Re: Утечка в WinXP: есть или нету?
Отправлено: serg_hd от Апрель 27, 2010, 19:58
Кстати вот уже 2 часа работает, утечек нет. А сворачивал или нет - не помню)). Странно это всё...

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

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


Название: Re: [решено] Утечка в WinXP: есть или нету?
Отправлено: serg_hd от Апрель 27, 2010, 21:33
Эх, найти бы ещё где-нибудь толковую статейку по возможностям Qt. Т.е. какие операции трудоёмки, а какие нет, в каких ситуациях что предпочтительней использовать в целях экономии времени и ресурсов системы. Мне, например, интересно тяжёлы ли для софтины сигналы/слоты или не очень. Речь идёт именно о больших нагрузках, сотни потоков, каждый из которых использовал бы их к примеру.