| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Утечка или кэширование вызова malloc |
| Автор: null56 9.3.2010, 15:48 | ||||||
| Всем привет Хотел поинтересоваться особенностью системных вызовов выделения и освобождения памяти
Написал небольшой пример, результат которого меня заинтересовал
По русски.... в цикле выделяем участки памяти произвольного размера и тут же освобождаем этот участок (размеры памяти выделяется довольно большие ~ 80 мегабайт и больше) Что меня насторожило: размер занимаемой программой памяти после отработки этого цикла вырос с 848 килобайт до 1068 килобайт... Хорошо, я предположил, что операционка начинает кешировать выделенные участки памяти для возможных повторных обращений, чем больше было запрошено памяти, тем больше этот кеш и тем больше приложение занимает памяти Но затем я дополнил программку другим циклом
тут уже выделялись участки памяти по страницам, но заметно меньшего размера и ВСЁ РАВНО РАЗМЕР ИСПОЛНЯЕМОГО ПРИЛОЖЕНИЯ ВЫРОС НА НЕСКОЛЬКО КИЛОБАЙТ Вопрос: 1) подскажите пожалуйста, с чем связано это увеличение памяти? 2) почему моя теория "о наибольшем участке" неверна? 3) можно ли как - нибудь решить это проблему из режима пользователя? ЗЫ: если нужно что - то почитать, направьте пожалуйста Заранее благодарен за помощь |
| Автор: GremlinProg 9.3.2010, 16:17 |
полагаю, опечатка, или что-то в этом роде напрямую malloc не влияет на память программы, если мы конечно об одном и том же говорим, я склоняюсь к тому, что ты имеешь ввиду столбик "Память" в диспетчере задач это просто индикатор физически отображенной памяти (текущий уровень в working set), которая в принципе зависит от интенсивности обращений к участку и в общем случае, максимальный и минимальный размер такого отображения заключен в небольшом диапазоне: ~30 страниц, если память мне не изменяет (можно эти параметры конечно и менять, но уже с соответствующими правами администратора, а по-умолчанию, для простых смертных эти права выключены) кэш на то и нужен, что позволяет на ограниченном "быстом" ресурсе (в окне) просматривать "медленные", но большие, в одном случае - просто для покрытия всего адресного пространства, сколь велико бы оно ни было, а в другом - для возможности оперативного переключения таких ресурсов (многозадачность) |
| Автор: Comm 9.3.2010, 18:08 |
| Советую почитать..очень хороший цикл статей про память http://wasm.ru/article.php?article=1021020 |
| Автор: GremlinProg 9.3.2010, 23:33 | ||||
для программиста, в сегодняшнем понимании - нет не несет, если опираться на то, что он оперирует виртуальной, а не физической памятью
довольно туманная формулировка, но если переживаешь именно за утечки памяти (memory leaks), то можно пользоваться довольно удобной утилитой: _CrtDumpMemoryLeaks, как раз для malloc, free, new, delete и т.п.: http://www.google.ru/search?q=CRT+memory+leaks |
| Автор: null56 10.3.2010, 22:01 |
| GremlinProg, ну суть в чем.... Я тему зовел из - за этой колонки диспетчера задач с физической памятью... Резервирую блоки(malloc), освобождаю(free), но в этой колонке, после освобождениея памяти, размер медленно, но верно разрастается по сравнению с только что запущенным приложением... это насторожило GremlinProg, спасибо за дебагер и советы Comm, спасибо за статью, прочитал с удовольствием, жаль что мало их там, но из первой части сделал выводы, которые побудили на перепроектирование программы |