Функции по работе с кучей позволяют создавать процессу скрытую область памяти, размером в одну или несколько страниц, в адресном пространстве вызываемого процесса. В дальнейшем, процесс может использовать набор функций, который позволяет ему разделять и управлять памятью, хранимой в куче. Не существует никаких различий между памятью, выделенной в куче, и памятью, выделенной любой другой функцией. Все функции для работы с кучей описаны в модуле Windows1).
Функция HeapCreate создает скрытую кучу, из которой вызывающий процесс может выделять фрагменты памяти путем использования фунцкции HeapAlloc. При вызове Функции HeapCreate задается начальный и максимальный размер кучи. Начальный размер задает количество доступных для чтения/записи страниц, под которыми расположена физическая память, и которые будут выделены при создании кучи. Максимальный размер определяет общее число зарезервированных страниц. Эти страницы создаются в соприкасающихся частях виртуального адресного пространства процесса, что позволяет куче расти. Дополнительным страницам автоматически передается физическая память из зарезрированных страниц, если происходит вызов функции HeapAlloc с требованием выделить памяти больше, чем доступно на текущий момент в куче. Страницы, которым однажды была выделена физическая память, не будут освобождены до тех пор, пока пока не завершиться процесс, либо пока не будет произведен вызов функции HeapDestroy, разрушающий кучу.
Память, находящаяся в куче, доступна только процессу, который создал эту кучу. Если куча была создана в динамочески подсоединяемой библиотеке (DLL), то она создается в адресном пространстве того процесса, который вызвал DLL, и она доступна только в этом процессе.
Функция HeapAlloc выделяет указанное число байт из кучи и возвращает указатель на выделенный блок. Полученный указатель мдентифицмрует фрагмент памяти в куче и может быть использован в функциях HeadFree для освобождения памяти и HeapSize для определения размера блока. Память, выделяемая постредством HeapAlloc, не является перемещаемой. Поэтому система не может сжать кучу, и куча может быть фрагментированной.
Возможным способом использования кучи является ее создание при запуске процесса с указанием начального размера, достаточного для удовлетворения требований процесса. Если вызов функции HeapCreate завершился неудачно, следует либо завершить процесс, либо сообщить об этом пользователю. Если вызов прошел удачно, то процесс может быть уверен в том, что он обладает необходимой памятью.
Память, полученная вызовом HeapCreate, не может быть наращена. Память, выделяемая при обращении к функции HeapAlloc является наращиваемой. Вы не должны производить операции чтения/записи в кучу, кроме как в ту область памяти, которая была выделена HeapAlloc. Не существует никаких завиимостей между двумя фрагментами памяти, которые были выделены посредством вызовов HeapAlloc.
Вы также не должны обращаться к той памяти, которая бла освобождена посредством вызова HeadFree. После того, как память освобождена, все хранившиеся в ней данные считаются навсегда потерянными. Никогда не освобождайте блок, который содержит требуемую вам информацию. Функции, которые возвращают информацию о блоке памяти (такие как HeapSize), также не могу быть использованы для освобожденных фрагментов. Для таких фрагментов функции возвращают недостоверные данные.
Много внешних фактром могут при работе с кучей вызвать исключение - нарушение доступа. Одной из возможных причин этого является слишом малый размер файла подкачки. Поэтому, все операции с кучей должны быть защищены блоком обработки исключений. Для большей информации по этому вопросу смотрите раздел "Структурная обработка исключений".
Отличия Windows 95/98
Менеджер памяти для кучи спроектирован так, что размер одного блока не может
превышать четыре мегабайта. Поэтому, если вы рассчитываете оперировать с блоками
размером более одного или двух мегабайт, то для этой цели мы рекомендуем
пользоваться функциями VirtualAlloc и
VirtualAllocEx.
Работа с кучей |
Примеры использования кучи![]() |
© Mystic, 2002