Функция HeapReAlloc позволяет изменить размер фрагмента памяти, которые был ранее выделен из указанной кучи и изменить свойства выделенного блока. Полученный в результате блок не является перемещаемым.
function HeapReAlloc( hHeap: THandle; // дескриптор кучи dwFlags: DWORD; // опции перераспределения памяти lpMem: Pointer; // указатель на фрагмент памяти, который будет перераспределен dwBytes: DWORD // новый размер блока в байтах ): Pointer; stdcall;
Параметры
[in]
Куча, в который был выделен блок, который будет перераспределен. Этот дескриптор
должен быть получен при помощи одной из функций
HeapCreate или
GetProcessHeap.
dwFlags [in]
Указывает несколько управляющих аспектов процесса перераспределения блока.
Указание соответствующих значений перекрывает значения, которые были указаны при
создании кучи при помощи вызова HeapCreate. Этот
параметр может быть комбинацией следующих флагов:
| Флаг | Назначение |
|---|---|
HEAP_GENERATE_EXCEPTIONS1) |
Указывает системе на то, что в случае возникновения ошибки необходимо генерировать исключительную ситуацию. Это будет происходить во всех случаях, когда функция должна была бы возвратить значение nil. |
HEAP_NO_SERIALIZE1) |
Указывает, что пока выполняется текущий вызов HeapReAlloc, к куче не будут происходить обращения из других потоков. Важно! Это значение не может быть указано при обращении к куче процесса. Система может создавать свои собственные потоки без участия приложения, например такие, как обработчик нажатия Ctrl+C, которые могут выполнять доступ к куче процесса. |
HEAP_REALLOC_IN_PLACE_ONLY1) |
Указывает на то, что при увеличении размера, блок не может быть перемещен в другой место. Если значение этого флага не указано, и требуется увеличить размер блока, то функция может перенести его в новое место. Если значение этого флага указано и функция не может произвести изменение размера блока без его перемещения в памяти, то функция возвратит код ошибки и никакого изменения указанного фрагмента памяти не произойдет. |
HEAP_ZERO_MEMORY1) |
Указывает на то, что при увеличении размера блока, добавляемый к блоку регион будет проинициализирован нулями. Старое содержимое блока при этом останется неизменным. |
hMem [in]
Указатель на фрагмент памяти, размер которого должен быть изменен. Этот
указатель должен быть получен ранее при помощи одого из вызовов функций
HeapAlloc или HeapReAlloc.
dwBytes [in]
Новый размер блока в байтах. Размер блока памяти может быть как увеличен, так
и уменьшен.
Важно! Если куча, указанная параметром hHeap не является "растущей" кучей, значение dwBytes всегда должно быть меньше $7FFF8. Вы можете создать такую кучу путем вызова функции HeapCreate с ненулевым параметром dwMaximumSize.
Возвращаемое значение
При успешном выполнении функция возвращает указатель на перераспределенный блок.
В случае возникновения ошибки если не указан флаг HEAP_GENERATE_EXCEPTIONS, то возвращаемым значением функции будет nil.
В случае возникновения ошибки если указан флаг HEAP_GENERATE_EXCEPTIONS, то будет сгенерирована одна из следующих исключительных ситуаций: EExternalError (с текстом сообщения "External Exception C000017" (значение $C000017 совпадает с константой STATUS_NO_MEMORY в модуле Windows) либо EAccessViolation.
Примечание: повреждение кучи может привести и к другому исключению, все зависит от характера повреждения кучи.
В случае ошибки она производит вызов функции SetLastError. Для получения расширенной информации об ошибке приложению следует сделать вызов GetLastError.
Описание
Если функция HeapReAlloc выполнилась успешно, то в результате было проведено успешное изменение размера фрагмента памяти до как минимум указанного размера. Но фактически новый размер фрагмента памяти может быть больше запрашиваемого. Приложение может безбоязненно использовать остаток. Для того, чтобы определить действительный размер выделенного фрагмента памяти, необходимо использовать функцию HeapSize.
Если функция HeapReAlloc заканчивается неудачей, то переданный ей фрагмент памяти не освобождается, и переданный на него указатель все еще остается правильным.
Для того, чтобы освободить блок памяти, выделенный при помощи функции HeapAlloc, следует использовать функцию HeapFree.
Защита от повторной входимости гарантирует, что в том случае, когда к куче будет происходить одновременно обращение из двух или нескольких потоков (например, один будет выделять память, а другой будет ее освобождать), работа с кучей будет происходить корректно. Тем не менее защита от повторной входимости требует некоторых затрат ресурсов, поэтому вы должны использовать ее только в том случае, когда несколько потоков одновременно обращаются к куче. Задавая флаг HEAP_NO_SERIALIZE, вы можете отключить защиту от повторной входимости. Одновременное обращение к куче из двух или нескольких потоков, при отключенной защите от повторной входимости, может повлечь за собой разрушение кучи. Поэтому вы должны отключать защиту от посторной входимости только в одном из следующих случаев:
Примечание: для того, чтобы уберечь себя от ошибки нарушения доступа (access violation), вы должны защитить блоками структурной обработки исключений любой код, выполняющий операции чтения/записи в кучу. Для большей информации по этому вопросу смотрите раздел "Структурная обработка исключений".
Отличия Windows 95/98
Менеджер памяти для кучи спроектирован так, что размер одного блока не может
превышать четыре мегабайта. Поэтому, если вы рассчитываете оперировать с блоками
размером более одного или двух мегабайт, то для этой цели мы рекомендуем
пользоваться функциями VirtualAlloc и
VirtualAllocEx.
Требования
Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
HeapLock |
HeapSize![]() |
© Mystic, 2002