Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt] управление памятью 
:(
    Опции темы
kefir01
Дата 31.10.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Вопрос такой... Скорее риторический...
Есть вот такой простой код

Код

    QFile file("testxml.xml");
    QByteArray ba;
    file.open(QIODevice::ReadOnly);
    ba = file.readAll();
    file.close();
    ba.clear();


Он (как можно видеть) грузит XML файл размера ~11мб и тут же удаляет загруженные данные. 
Если понаблюдать за приложением, то до запуска кода оно занимает ~13,6 мб... после запуска - ~25мб.
То есть объем возрастает на те самые ~11 мб XML файла.

При последующих нажатиях кнопки (выполняющей данный код) количество выделенной под приложение памяти не меняется в большую сторону (что хорошо и ожидаемо), однако несмотря на закрытие файла и очистку массива данных не уменьшается до положенных ~13,6 мб.

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

Мне бы хотелось временами отпускать эту память - есть ли способы? Или я что-то делаю не так?
PM MAIL   Вверх
borisbn
Дата 31.10.2011, 22:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(kefir01 @  31.10.2011,  21:44 Найти цитируемый пост)
и тут же удаляет загруженные данные. 

Цитата(kefir01 @  31.10.2011,  21:44 Найти цитируемый пост)
несмотря на закрытие файла и очистку массива

не вижу. где ? clear ничего не делает, кроме установки внутренней переменной, отвечающей за размер, в 0.

Цитата(kefir01 @  31.10.2011,  21:44 Найти цитируемый пост)
Мне бы хотелось временами отпускать эту память - есть ли способы?

Код

void reallyClearByteArray( QByteArray & ba )
{
    QByteArray null_ba;
    std::swap( ba, null_ba );
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 31.10.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



а можно еще добавить вызов метода squeeze() после clear().
PM   Вверх
borisbn
Дата 31.10.2011, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



А можно ещё проще
Код

ba = QByteArray();

smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 31.10.2011, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



borisbn, а вот в этом не уверен - QByteArray() скорее всего выделяет память в куче (PIMPL).
PM   Вверх
borisbn
Дата 31.10.2011, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



bsa, ну и что ? ba же очистится.
Вот код QByteArray::operator= из 4.7.3
Код

QByteArray &QByteArray::operator=(const QByteArray & other)
{
    other.d->ref.ref();
    if (!d->ref.deref())
        qFree(d);                 // <--- что и требовалось
    d = other.d;
    return *this;
}



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
kefir01
Дата 31.10.2011, 23:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Спасибо, однако ни squeeze(), ни ba = QByteArray(); не помогли...
Может все дело в том что у меня Lion? 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ______________2011_11_01___0.14.26.png 188,36 Kb
PM MAIL   Вверх
ecspertiza
Дата 1.11.2011, 17:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 763
Регистрация: 3.11.2008
Где: г.Смоленск

Репутация: 4
Всего: 5



Мне почему то думается, что даже очистив массив память останется зарезервированной, а по необходимости ОС ее отожмет в свое распряжение.


--------------------
С уважением,
мастер конфетного цеха!

онлайн компилер
залип
PM MAIL   Вверх
bsa
Дата 1.11.2011, 19:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



kefir01, когда ты делаешь malloc (а new работает через malloc), то стандартная библиотека пытается выделить память в "куче". Если в ней нет подходящего свободного куска, то malloc обращается к ядру системы с целью увеличения доступной процессу памяти. Ядро просьбу удовлетворяет и ты видишь, что процесс стал жрать памяти больше. Затем ты вызываешь free (через него работает и delete), область памяти в куче становится "свободной". Но системе malloc эту память возвращать не спешит... В следующий раз выделять память он будет именно в этой области без обращения к ядру.
PM   Вверх
kefir01
Дата 1.11.2011, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



bsa, спасибо. В целом я это понимаю - т.е. нет смысла отдавать память? Дже если я сначала 100мб грузанул, а потом больше 10 не буду?
Другие приложения не перекроются?
PM MAIL   Вверх
alexvs11
Дата 1.11.2011, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: 2
Всего: 10



Цитата(kefir01 @  1.11.2011,  23:43 Найти цитируемый пост)
bsa, спасибо. В целом я это понимаю - т.е. нет смысла отдавать память? Дже если я сначала 100мб грузанул, а потом больше 10 не буду?Другие приложения не перекроются?

конечно есть
если вы не освобождаете память в куче, то приложению приходится запрашивать у ОС еще страниц памяти
если в системе будет мало памяти, то она может запросить у вашего приложения освобожденные страницы памяти, если вы их освободили
PM MAIL   Вверх
kefir01
Дата 2.11.2011, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



alexvs11, я имел в виду таким образом, чтобы результат отображался в мониторе процессов...
Так-то я знаю, что надо чистить память)
PM MAIL   Вверх
bsa
Дата 2.11.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(kefir01 @  2.11.2011,  16:25 Найти цитируемый пост)
alexvs11, я имел в виду таким образом, чтобы результат отображался в мониторе процессов...

Вот на это надо заморачиваться в самую последнюю очередь. Если память долго не используется, но необходима другим процессам, то она может быть отправлена в своп.
PM   Вверх
kefir01
Дата 2.11.2011, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 213
Регистрация: 22.6.2007

Репутация: 1
Всего: 2



Ок, спасибо, друзья!

А что вы думаете по поводу qDeleteAll - насколько имеет смысл...
Насколько я понимаю есть два варианта:

1:
Код

QVector<myClass*> vec;
//...
qDeleteAll(vec);
vec.clear();


2:
Код

QVector<myClass> vec;
//...
vec.clear();


Или 2-го варианта достаточно?
PM MAIL   Вверх
borisbn
Дата 2.11.2011, 17:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Цитата(kefir01 @  2.11.2011,  17:19 Найти цитируемый пост)
Или 2-го варианта достаточно?

конечно нет. Если в векторе лежат указатели, то под них была выделена память. Её нужно освободить.
Короче, без qDeleteAll будет leak.
Единственный вариант, когда этого делать не нужно, это когда эти указатели были запихнуты в вектор таким способом:
Код

MyClass a;
MyClass b;
QVector<myClass*> vec;
vec.push_back( &a );
vec.push_back( &b );


А ещё лучше хранить в векторе QSharedPointer или std::shared_ptr

Это сообщение отредактировал(а) borisbn - 2.11.2011, 17:27


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0623 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.