Russian Qt Forum
Ноябрь 23, 2024, 13:48
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
AHTUNG!!! Утечка
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: AHTUNG!!! Утечка (Прочитано 10673 раз)
merke
Гость
AHTUNG!!! Утечка
«
:
Июль 19, 2013, 13:52 »
Всем здрасти!
Может кто сталкивался с подобной проблемой.
Есть структурка:
Код:
mySt
{
QByteArray a;
QByteArray b;
};
Есть список данных структур:
Код:
QList<mySt> lstSt;
Есть функция, которая заполняет этот список данными.
Так вот, если наполнить этот список данными и попробовать его очистить допустим в деструкторе, то память не освобождается, а вот если этот список чистить в самой функцие где и производилось его заполнение, то память успешно освобождается. Мистика прям. Почему если покинуть функцию где наполнялся список, невозможно в дальнейшем освободить память занимаемая им.
«
Последнее редактирование: Июль 19, 2013, 18:21 от Александр
»
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: AHTUNG!!! Утечка
«
Ответ #1 :
Июль 19, 2013, 14:11 »
Откуда ты узнаёшь, что память не освобождается?
Записан
merke
Гость
Re: AHTUNG!!! Утечка
«
Ответ #2 :
Июль 19, 2013, 14:21 »
Смотрю на резидентную память по htop
Записан
Alex Custov
Джедай : наставник для всех
Offline
Сообщений: 2063
Re: AHTUNG!!! Утечка
«
Ответ #3 :
Июль 19, 2013, 14:25 »
Цитата: Александр от Июль 19, 2013, 14:21
Смотрю на резидентную память по htop
Освобождаемость памяти нужно проверять по деструкторам. Добавь в структуру деструктор и в нём debug сообщение - как пить дать оно будет показываться.
Записан
merke
Гость
Re: AHTUNG!!! Утечка
«
Ответ #4 :
Июль 19, 2013, 14:27 »
Это уже сделано, деструктор чистит все, но по htop память остается. Вычитал, что QList может только разрастаться, но сужаться уже ни как. Вопрос теперь, а как же эту гадость удалить теперь? почистить?
Записан
Bepec
Гость
Re: AHTUNG!!! Утечка
«
Ответ #5 :
Июль 19, 2013, 14:47 »
Версия Qt? ОС?
List спокойно чистится и ничего не оставляет. Приведите цифры пожалуйста, например
Цитировать
Список в __ млн QByteArray("тест").
Сожрало __ гигабайт.
После удаления списка осталось занято __ гигабайт.
Через минуту ситуация изменилась/осталась прежней/память возросла на __ / память уменьшилась до __, нужное подчеркнуть.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: AHTUNG!!! Утечка
«
Ответ #6 :
Июль 19, 2013, 14:51 »
Цитата: Александр от Июль 19, 2013, 14:27
Это уже сделано, деструктор чистит все, но по htop память остается.
Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.
Цитата: Александр от Июль 19, 2013, 14:27
Вычитал, что QList может только разрастаться, но сужаться уже ни как.
Бред.
Цитата: Александр от Июль 19, 2013, 14:27
Вопрос теперь, а как же эту гадость удалить теперь? почистить?
Все удаляется и ничего чистить не надо. Если вашему процессу понадобиться память, то она не будет запрашиваться у ОС, а будет использоваться уже распределенная.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: AHTUNG!!! Утечка
«
Ответ #7 :
Июль 19, 2013, 16:47 »
Цитата: Old от Июль 19, 2013, 14:51
Правильно, эта память остается за процессом и он может ее использовать по своему усмотрению. Уже 100500 раз обсуждалось.
Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".
QList::clear() освобождает все (по крайней мере начиная с версии 4.7). Др дело если распределили напр 1 миллион элементов, а потом удалили и оставили всего 1. Да, там хвостики останутся, но то же самое и std контейнерами
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: AHTUNG!!! Утечка
«
Ответ #8 :
Июль 19, 2013, 16:51 »
Цитата: Igors от Июль 19, 2013, 16:47
Много раз слышал эту легенду, но не знаю ни одного места где Qt держало бы "резерв памяти".
Причем здесь Qt и какой резерв памяти?
Записан
Bepec
Гость
Re: AHTUNG!!! Утечка
«
Ответ #9 :
Июль 19, 2013, 17:08 »
Igors вот тут вы в роли незнающего.
Это режим взаимодействия ОС и процесса. Можете почитать.
Записан
merke
Гость
Re: AHTUNG!!! Утечка
«
Ответ #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
Сообщений: 2063
Re: AHTUNG!!! Утечка
«
Ответ #11 :
Июль 19, 2013, 18:42 »
эта память может быть занята другим приложением по первому требованию.
Записан
merke
Гость
Re: AHTUNG!!! Утечка
«
Ответ #12 :
Июль 20, 2013, 08:12 »
А этот процесс как нибудь контролируем допустим посредством API. Чтобы принудительно отдать память системе?
Записан
Bepec
Гость
Re: AHTUNG!!! Утечка
«
Ответ #13 :
Июль 20, 2013, 09:12 »
Нееет
Хотя в линуксе всё может быть
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: AHTUNG!!! Утечка
«
Ответ #14 :
Июль 20, 2013, 09:36 »
Цитата: Александр от Июль 19, 2013, 18:16
Вообщем проделал я следующий эксперимент.
На Mac OSX (linuх posix) штатная утилита Activity Monitor четко показывает что clear() все отдает. А что там делает та или иная версия Linuх - ее личное дело, повлиять на это все равно нельзя (на уровне прикладной программы). В общем, как в том анекдоте "это просто трусы линяют"
Записан
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...