Изучая исходный код 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 кажется неправильной, скорее всего, реликтом какой-то старой версии среды выполнения.