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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: AHTUNG!!! Утечка  (Прочитано 10676 раз)
merke
Гость
« : Июль 19, 2013, 13:52 »

Всем здрасти!

Может кто сталкивался с подобной проблемой.

Есть структурка:

Код:
mySt
{
 QByteArray a;
 QByteArray b;
};

Есть список данных структур:
Код:
QList<mySt> lstSt;

Есть функция, которая заполняет этот список данными.

Так вот, если наполнить этот список данными и попробовать его очистить допустим в деструкторе, то память не освобождается, а вот если этот список чистить в самой функцие где и производилось его заполнение, то память успешно освобождается. Мистика прям. Почему если покинуть функцию где наполнялся список, невозможно в дальнейшем освободить память занимаемая им.

« Последнее редактирование: Июль 19, 2013, 18:21 от Александр » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Июль 19, 2013, 14:11 »

Откуда ты узнаёшь, что память не освобождается?
Записан
merke
Гость
« Ответ #2 : Июль 19, 2013, 14:21 »

Смотрю на резидентную память по htop
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июль 19, 2013, 14:25 »

Смотрю на резидентную память по htop

Освобождаемость памяти нужно проверять по деструкторам. Добавь в структуру деструктор и в нём debug сообщение - как пить дать оно будет показываться.
Записан
merke
Гость
« Ответ #4 : Июль 19, 2013, 14:27 »

Это уже сделано, деструктор чистит все, но по htop память остается. Вычитал, что QList может только разрастаться, но сужаться уже ни как. Вопрос теперь, а как же эту гадость удалить теперь? почистить?
Записан
Bepec
Гость
« Ответ #5 : Июль 19, 2013, 14:47 »

Версия Qt? ОС?

List спокойно чистится и ничего не оставляет. Приведите цифры пожалуйста, например
Цитировать
Список в __ млн QByteArray("тест").
Сожрало __ гигабайт.
После удаления списка осталось занято __ гигабайт.
Через минуту ситуация изменилась/осталась прежней/память возросла на __ / память уменьшилась до __, нужное подчеркнуть.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июль 19, 2013, 14:51 »

Это уже сделано, деструктор чистит все, но по htop память остается.
Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.

Вычитал, что QList может только разрастаться, но сужаться уже ни как.
Бред.

Вопрос теперь, а как же эту гадость удалить теперь? почистить?
Все удаляется и ничего чистить не надо. Если вашему процессу понадобиться память, то она не будет запрашиваться у ОС, а будет использоваться уже распределенная.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Июль 19, 2013, 16:47 »

Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.
Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".

QList::clear() освобождает все (по крайней мере начиная с версии 4.7). Др дело если распределили напр 1 миллион элементов, а потом удалили и оставили всего 1. Да, там хвостики останутся, но то же самое и std контейнерами 
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июль 19, 2013, 16:51 »

Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".
Причем здесь Qt и какой резерв памяти?
Записан
Bepec
Гость
« Ответ #9 : Июль 19, 2013, 17:08 »

Igors вот тут вы в роли незнающего. Улыбающийся

Это режим взаимодействия ОС и процесса. Можете почитать.
Записан
merke
Гость
« Ответ #10 : Июль 19, 2013, 18:16 »

Вообщем проделал я следующий эксперимент.

Взял два QList'а, первый заполнил 10-тью мегабайтами, т.е. 10 элементов, каждый по 1 мб. Взял его зачистил при помощи метода clear(), по htop, как было занято 10 мб, так и осталось. Далее начал во второй QList добавлять по 1 мб, 10 таких добавлений не изменили размер процесса в памяти, а вот уже 11 итерация прибавила 1 мб к памяти процесса. Вывод следующий: ядро Linux резервирует память под процесс. Не ясно следующее, почему если в той же самой функции где шло заполнение контейнера, сразу для него вызвать clear(), то память освободится, а вот если уже допустим в деструкторе чистить, то память не освобождается. Догадки следующие: ядро считает, что если я в функции занял определенный участок памяти и тут же его удаляю, то нужно этот участок памяти оставить системе, а вот если уже создал и дальше работаю с ней, то и в будущем моему процессу понадобится такой вот участок памяти, банально, но фиг знает может так и есть.

Пробовал также у самого QList'а "пропатчить" метод reserve(), а именно комментил условие, что если пытаются зарезирвировать меньшее число чем сейчас есть, то не делать реалок памяти, я думал, что если так сделаю, то смогу при отчистке сделать просто reserve(0) моему контейнеру, а в итоге шиш, что еще раз подтверждает тот факт, что ядро линукса оставляет память за процессом.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Июль 19, 2013, 18:42 »

эта память может быть занята другим приложением по первому требованию.
Записан
merke
Гость
« Ответ #12 : Июль 20, 2013, 08:12 »

А этот процесс как нибудь контролируем допустим посредством API. Чтобы принудительно отдать память системе?
Записан
Bepec
Гость
« Ответ #13 : Июль 20, 2013, 09:12 »

Нееет Улыбающийся Хотя в линуксе всё может быть Веселый
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Июль 20, 2013, 09:36 »

Вообщем проделал я следующий эксперимент.
На Mac OSX (linuх posix) штатная утилита Activity Monitor четко показывает что clear() все отдает. А что там делает та или иная версия Linuх - ее личное дело, повлиять на это все равно нельзя (на уровне прикладной программы). В общем, как в том анекдоте "это просто трусы линяют"  Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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