Функции кучи

Каждый процесс имеет кучу по умолчанию, предоставляемую системой. Приложения, которые часто выделяют ресурсы из кучи, могут повысить производительность с помощью частных кучи.

Частная куча — это блок одной или нескольких страниц в адресном пространстве вызывающего процесса. После создания частной кучи процесс использует такие функции, как HeapAlloc и HeapFree , для управления памятью в этой куче.

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

Нет различий между памятью, выделенной из частной кучи, и памятью, выделенной с помощью других функций выделения памяти. Полный список функций см. в таблице в разделе Функции управления памятью.

Примечание

Поток должен вызывать функции кучи только для кучи по умолчанию процесса и частных кучи, создаваемых потоком и управляемых им, используя дескрипторы, возвращаемые функцией GetProcessHeap или HeapCreate .

 

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

Память частного объекта кучи доступна только процессу, создав его. Если библиотека динамической компоновки (DLL) создает частную кучу, она делает это в адресном пространстве процесса, который вызвал библиотеку DLL. Он доступен только для этого процесса.

Функция HeapAlloc выделяет указанное количество байтов из частной кучи и возвращает указатель на выделенный блок. Этот указатель можно использовать в функциях HeapFree, HeapReAlloc, HeapSize и HeapValidate .

Память, выделенная HeapAlloc , не перемещается. Адрес, возвращаемый HeapAlloc , действителен до освобождения или перераспределения блока памяти; Блок памяти не нужно блокировать.

Так как система не может сжать частную кучу, она может стать фрагментаной. Приложения, выделяющие большие объемы памяти с различными размерами выделения, могут использовать кучу с низким уровнем фрагментации для уменьшения фрагментации кучи.

Функции кучи можно использовать для создания частной кучи при запуске процесса, указав начальный размер, достаточный для удовлетворения требований процесса к памяти. Если вызов функции HeapCreate завершается сбоем, процесс может завершиться или уведомить пользователя о нехватке памяти; Однако, если он будет успешным, процесс будет гарантированно иметь необходимую память.

Память, запрашиваемая Методом HeapCreate , может быть непрерывной. Память, выделенная в куче HeapAlloc , является непрерывной. Не следует выполнять запись или чтение из памяти в куче, за исключением памяти, выделенной HeapAlloc, и не следует предполагать связь между двумя областями памяти, выделенными HeapAlloc.

Вы не должны каким-либо образом ссылаться на память, которая была освобождена HeapFree. После освобождения памяти любая информация, которая могла быть в ней, исчезает навсегда. Если требуется информация, не освобождайте память, содержащую эти сведения. Вызовы функций, возвращающие сведения о памяти (например , HeapSize), не могут использоваться с освобожденной памятью, так как они могут возвращать фиктивные данные.

Функция HeapDeкистрой уничтожает частный объект кучи. Он удаляет и освобождает все страницы объекта кучи, а также делает дескриптор кучи недействительным.

Сравнение методов выделения памяти