![]() |
|
|
![]()
|
|
| kefir01 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 22.6.2007 Репутация: 1 Всего: 2 |
Вопрос такой... Скорее риторический...
Есть вот такой простой код
Он (как можно видеть) грузит XML файл размера ~11мб и тут же удаляет загруженные данные. Если понаблюдать за приложением, то до запуска кода оно занимает ~13,6 мб... после запуска - ~25мб. То есть объем возрастает на те самые ~11 мб XML файла. При последующих нажатиях кнопки (выполняющей данный код) количество выделенной под приложение памяти не меняется в большую сторону (что хорошо и ожидаемо), однако несмотря на закрытие файла и очистку массива данных не уменьшается до положенных ~13,6 мб. Так вот интересно что вы по этому поводу думаете... Я так предполагаю, что однажды вделив под данные 11 мб оперативки программа их резервирует и в дальнейшем загружает, что называется, на то же место... Мне бы хотелось временами отпускать эту память - есть ли способы? Или я что-то делаю не так? |
|||
|
||||
| borisbn |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
не вижу. где ? clear ничего не делает, кроме установки внутренней переменной, отвечающей за размер, в 0.
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
а можно еще добавить вызов метода squeeze() после clear().
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
А можно ещё проще
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
borisbn, а вот в этом не уверен - QByteArray() скорее всего выделяет память в куче (PIMPL).
|
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
bsa, ну и что ? ba же очистится.
Вот код QByteArray::operator= из 4.7.3
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| kefir01 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 22.6.2007 Репутация: 1 Всего: 2 |
Спасибо, однако ни squeeze(), ни ba = QByteArray(); не помогли...
Может все дело в том что у меня Lion? Присоединённый файл ( Кол-во скачиваний: 8 )
______________2011_11_01___0.14.26.png 188,36 Kb |
|||
|
||||
| ecspertiza |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 763 Регистрация: 3.11.2008 Где: г.Смоленск Репутация: 4 Всего: 5 |
Мне почему то думается, что даже очистив массив память останется зарезервированной, а по необходимости ОС ее отожмет в свое распряжение.
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
kefir01, когда ты делаешь malloc (а new работает через malloc), то стандартная библиотека пытается выделить память в "куче". Если в ней нет подходящего свободного куска, то malloc обращается к ядру системы с целью увеличения доступной процессу памяти. Ядро просьбу удовлетворяет и ты видишь, что процесс стал жрать памяти больше. Затем ты вызываешь free (через него работает и delete), область памяти в куче становится "свободной". Но системе malloc эту память возвращать не спешит... В следующий раз выделять память он будет именно в этой области без обращения к ядру.
|
|||
|
||||
| kefir01 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 22.6.2007 Репутация: 1 Всего: 2 |
bsa, спасибо. В целом я это понимаю - т.е. нет смысла отдавать память? Дже если я сначала 100мб грузанул, а потом больше 10 не буду?
Другие приложения не перекроются? |
|||
|
||||
| alexvs11 |
|
|||
|
hell is here ![]() ![]() Профиль Группа: Участник Сообщений: 518 Регистрация: 21.8.2010 Репутация: 2 Всего: 10 |
конечно есть если вы не освобождаете память в куче, то приложению приходится запрашивать у ОС еще страниц памяти если в системе будет мало памяти, то она может запросить у вашего приложения освобожденные страницы памяти, если вы их освободили |
|||
|
||||
| kefir01 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 22.6.2007 Репутация: 1 Всего: 2 |
alexvs11, я имел в виду таким образом, чтобы результат отображался в мониторе процессов...
Так-то я знаю, что надо чистить память) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 24 Всего: 196 |
||||
|
||||
| kefir01 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 213 Регистрация: 22.6.2007 Репутация: 1 Всего: 2 |
Ок, спасибо, друзья!
А что вы думаете по поводу qDeleteAll - насколько имеет смысл... Насколько я понимаю есть два варианта: 1:
2:
Или 2-го варианта достаточно? |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 48 Всего: 135 |
конечно нет. Если в векторе лежат указатели, то под них была выделена память. Её нужно освободить. Короче, без qDeleteAll будет leak. Единственный вариант, когда этого делать не нужно, это когда эти указатели были запихнуты в вектор таким способом:
А ещё лучше хранить в векторе QSharedPointer или std::shared_ptr Это сообщение отредактировал(а) borisbn - 2.11.2011, 17:27 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]()
|
| Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |