Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Утечка или кэширование вызова malloc, Почему не освобождается до конца 
V
    Опции темы
null56
Дата 9.3.2010, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 12



Всем привет
Хотел поинтересоваться особенностью системных вызовов выделения и освобождения памяти
Код

void *malloc(
   size_t size 
);

void free( 
   void *memblock 
);


Написал небольшой пример, результат которого меня заинтересовал
Код

    for (int i = 50; i < 65; i++)
    {
        __test_Heap(i);
    }
.................................................
void __test_Heap(int i)
{
    void * ptr = malloc(79788659 + i * 597889);
    free(ptr);
}

По русски....
в цикле выделяем участки памяти произвольного размера и тут же освобождаем этот участок (размеры памяти выделяется довольно большие ~ 80 мегабайт и больше)
Что меня насторожило: размер занимаемой программой памяти после отработки этого цикла вырос с 848 килобайт до 1068 килобайт...
Хорошо, я предположил, что операционка начинает кешировать выделенные участки памяти для возможных повторных обращений, чем больше было запрошено памяти, тем больше этот кеш и тем больше приложение занимает памяти

Но затем я дополнил программку другим циклом
Код

    for (int i = 1000; i < 55500; i+=5000)
    {
        __test_heap_page(i);
    }
................
void __test_heap_page(int i)
{
    int pages_num = i / 4096;
    void * ptr = malloc(pages_num * 4096);
    free(ptr);
}

тут уже выделялись участки памяти по страницам, но заметно меньшего размера и ВСЁ РАВНО РАЗМЕР ИСПОЛНЯЕМОГО ПРИЛОЖЕНИЯ ВЫРОС НА НЕСКОЛЬКО КИЛОБАЙТ

Вопрос:
1) подскажите пожалуйста, с чем связано это увеличение памяти?
2) почему моя теория "о наибольшем участке" неверна?
3) можно ли как - нибудь решить это проблему из режима пользователя?

ЗЫ: если нужно что - то почитать, направьте пожалуйста

Заранее благодарен за помощь
PM MAIL   Вверх
GremlinProg
Дата 9.3.2010, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(null56 @  9.3.2010,  17:48 Найти цитируемый пост)
РАЗМЕР ИСПОЛНЯЕМОГО ПРИЛОЖЕНИЯ ВЫРОС НА НЕСКОЛЬКО КИЛОБАЙТ

полагаю, опечатка, или что-то в этом роде

напрямую malloc не влияет на память программы, если мы конечно об одном и том же говорим,
я склоняюсь к тому, что ты имеешь ввиду столбик "Память" в диспетчере задач

это просто индикатор физически отображенной памяти (текущий уровень в working set),
которая в принципе зависит от интенсивности обращений к участку и в общем случае, максимальный и минимальный размер такого отображения заключен в небольшом диапазоне: ~30 страниц, если память мне не изменяет (можно эти параметры конечно и менять, но уже с соответствующими правами администратора, а по-умолчанию, для простых смертных эти права выключены)

кэш на то и нужен, что позволяет на ограниченном "быстом" ресурсе (в окне) просматривать "медленные", но большие,

в одном случае - просто для покрытия всего адресного пространства, сколь велико бы оно ни было,
а в другом - для возможности оперативного переключения таких ресурсов (многозадачность)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
null56
Дата 9.3.2010, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 12



Цитата(GremlinProg @  9.3.2010,  16:17 Найти цитируемый пост)
полагаю, опечатка, или что-то в этом роде

да, извиняюсь... Имел в виду физическую память, размер которого отображает диспетчер задач

Цитата(GremlinProg @  9.3.2010,  16:17 Найти цитируемый пост)
я склоняюсь к тому, что ты имеешь ввиду столбик "Память" в диспетчере задач

да, я имею в виду его


GremlinProg, то есть этот параметр не несет за собой реальной информации об использовании памяти и рано или поздно он освободит её?

я к чему задал вопрос, просто пишу приложение, которое должно работать длительное время. если это приложение потихоньку будет отжирать физической памяти, то через некоторое время это будет уже слишком накладно. сейчас думаю, как снизить количество системных вызовов
PM MAIL   Вверх
Comm
Дата 9.3.2010, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Советую почитать..очень хороший цикл статей про память
ссылка


--------------------
=)))))
user posted image
PM MAIL ICQ   Вверх
GremlinProg
Дата 9.3.2010, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(null56 @  9.3.2010,  19:57 Найти цитируемый пост)
то есть этот параметр не несет за собой реальной информации об использовании памяти и рано или поздно он освободит её?

для программиста, в сегодняшнем понимании - нет не несет, если опираться на то, что он оперирует виртуальной, а не физической памятью
Цитата(null56 @  9.3.2010,  19:57 Найти цитируемый пост)
пишу приложение, которое должно работать длительное время. если это приложение потихоньку будет отжирать физической памяти, то через некоторое время это будет уже слишком накладно

довольно туманная формулировка, но если переживаешь именно за утечки памяти (memory leaks), то можно пользоваться довольно удобной утилитой: _CrtDumpMemoryLeaks, как раз для malloc, free, new, delete и т.п.: http://www.google.ru/search?q=CRT+memory+leaks


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
null56
Дата 10.3.2010, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: нет
Всего: 12



GremlinProg, ну суть в чем.... Я тему зовел из - за этой колонки диспетчера задач с физической памятью... Резервирую блоки(malloc), освобождаю(free), но в этой колонке, после освобождениея памяти, размер медленно, но верно разрастается по сравнению с только что запущенным приложением... это насторожило
GremlinProg, спасибо за дебагер и советы

Comm, спасибо за статью, прочитал с удовольствием, жаль что мало их там, но из первой части сделал выводы, которые побудили на перепроектирование программы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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