Будет ли Visual C ++ во время выполнения malloc / free возвращать память в ОС? - PullRequest
5 голосов
/ 27 июня 2011

Вопрос очень похож на Будут ли реализации malloc возвращать свободную память обратно в систему? , но меня интересует ответ для Windows / Microsoft Visual Studio и подробности на точное состояние виртуальной памяти.

Будет ли Visual C ++ CRT free возвращать память обратно в систему? Каково будет точное состояние памяти относительно распределения виртуальной памяти? После освобождения большого блока памяти будет ли выделена, зарезервирована или свободна память в блоке? Что если я позвоню _heapmin после бесплатного?

Ответы [ 2 ]

6 голосов
/ 27 июня 2011

Изучая исходный код 2010 года, можно увидеть malloc / free call HeapAlloc / HeapFree Функции Win32 API напрямую, с _crtheap в качестве кучи, созданной средой выполнения.Ответ для VS 2010 и последних версий Windows (Win2000, WinXP, Vista, Win 7), следовательно, таков:

Память, возвращаемая свободной, возвращается в ОС, но остается зафиксированной.

Документация по функциям кучи говорит следующее о том, как обрабатывается выделение памяти:

Функция HeapCreate создает частный объект кучи, из которого вызывающий процесс может выделить памятьблоки с помощью функции HeapAlloc.... Дополнительные страницы автоматически фиксируются из этого зарезервированного пространства, если запросы HeapAlloc превышают текущий размер зафиксированных страниц, при условии, что физическое хранилище для него доступно.Как только страницы зафиксированы, они не списываются до тех пор, пока процесс не прекратится или пока куча не будет уничтожена путем вызова функции HeapDestroy.

Более того В документации HeapCreate говорится следующее относительно случаякучи без установленного максимального размера:

Если dwMaximumSize равен 0, размер кучи может увеличиться.Размер кучи ограничен только доступной памятью.Запросы на выделение блоков памяти, превышающих ограничение для кучи фиксированного размера, не завершаются автоматически;вместо этого система вызывает функцию VirtualAlloc для получения памяти, необходимой для больших блоков.Приложения, которым нужно выделять большие блоки памяти, должны установить для dwMaximumSize значение 0.

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

Что касается _heapmin , то с VS 2010 ничего не происходит, так как он вызывает только HeapCompact , а куча CRT не имеет автоматического объединения набесплатно выключен.Поэтому документация для _heapmin кажется неправильной, скорее всего, реликтом какой-то старой версии среды выполнения.

1 голос
/ 27 июня 2011

Нет, он не вернет память "системе"._heapmin освобождает только целые страницы, которые пусты, и часто имеют небольшой эффект.Это не перемешивает данные между страницами.Таким образом, это зависит от того, где в куче освобождается память, от того, уменьшит ли комбинация free () и _heapmin количество используемых страниц или нет.Также обратите внимание, что VS использует другую кучу для отладки и выпуска.

Для получения дополнительной информации см. API-интерфейсы HeapCreate () / HeapAlloc () и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...