Основы программирования в Win32API. Марапулец Ю.В. - 56 стр.

UptoLike

Составители: 

HeapSize(). Наряду с байтами блока при каждом выделении будет задействовано
несколько дополнительных байтов, необходимых для поддержки внутренней
структуры динамической области памяти. Точный размер этого дополнительно-
го кусочка памяти варьируется и составляет в среднем около 16 байтов. Это не-
обходимо знать, потому что без учета подобных «накладных расходов» невоз-
можно выделить из кучи столько блоков, сколько изначально требовалось. Если
создать динамическую область памяти объемом 2 Мб и попытаться выделить из
нее два блока размером по 1 Мб каждый, то второй блок, скорее всего, не будет
выделен.
Изменить размер блока после его выделения позволяет функция Hea-
pReAlloc():
LPSTR HeapReAlloc
(HANDLE, hHeap, // дескриптор локальной кучи
DWORD dwFlags, // флаги, влияющие на перераспределение памяти
LPSTR lpMem, // адрес блока памяти, размер которого изменяется
DWORD dwBytes, // новый размер выделенного блока памяти);…
Кроме двух флагов, которые функция HeapAllос() использовала для обнуле-
ния памяти и для генерации исключений, параметр dwFlags функции
HeapReAlloc() принимает еще один флаг – HEAP_REALLOC_IN_PLACE_ONLY.
(Microsoft заботится о том, чтобы мы все понимали, объединив целых пять слов в
имени одной-единственной константы.) Этот флаг предотвращает перемещение
выделенного блока в более свободную область памяти, выполняемое функцией
HeapReAlloc. Если соседние блоки мешают расширению данного блока до тре-
буемого размера, в результате выполнения функции HeapReAlloc() возникает
ошибка. Флаг HEAP_REALLOC_IN_PLACE_ONLY
обычно применяется в соче-
тании с другими флагами.
Если выделенный блок памяти больше не нужен, освободите его с помо-
щью функции HeapFree(). Если же отсутствует необходимость и в самой куче,
освободите ее посредством функции HeapDestroy():
BOOL HeapFree
(HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // не используется (должен быть равен нулю)
LPSTR lpMem, // адрес освобождаемого блока памяти);…
BOOL HeapDestroy( HANDLE hHeap);…
Освобождение блока памяти не приводит к отмене закрепления страниц,
которые он занимал, однако это пространство становится доступным для по-
следующих выделений из той же динамической области памяти. Функция
HeapDestroy() освобождает все страницы кучи, независимо от наличия в ней
выделенных блоков. После выполнения функции HeapDestroy() дескриптор
hHeap становится недействительным (неопределенным).
Еще один набор функций предназначен для проверки правильности ука-
56
HeapSize(). Наряду с байтами блока при каждом выделении будет задействовано
несколько дополнительных байтов, необходимых для поддержки внутренней
структуры динамической области памяти. Точный размер этого дополнительно-
го кусочка памяти варьируется и составляет в среднем около 16 байтов. Это не-
обходимо знать, потому что без учета подобных «накладных расходов» невоз-
можно выделить из кучи столько блоков, сколько изначально требовалось. Если
создать динамическую область памяти объемом 2 Мб и попытаться выделить из
нее два блока размером по 1 Мб каждый, то второй блок, скорее всего, не будет
выделен.
     Изменить размер блока после его выделения позволяет функция Hea-
pReAlloc():
LPSTR HeapReAlloc
    (HANDLE, hHeap,        // дескриптор локальной кучи
    DWORD dwFlags, // флаги, влияющие на перераспределение памяти
    LPSTR lpMem,    // адрес блока памяти, размер которого изменяется
    DWORD dwBytes,      // новый размер выделенного блока памяти);…
     Кроме двух флагов, которые функция HeapAllос() использовала для обнуле-
ния памяти и для генерации исключений, параметр dwFlags функции
HeapReAlloc() принимает еще один флаг – HEAP_REALLOC_IN_PLACE_ONLY.
(Microsoft заботится о том, чтобы мы все понимали, объединив целых пять слов в
имени одной-единственной константы.) Этот флаг предотвращает перемещение
выделенного блока в более свободную область памяти, выполняемое функцией
HeapReAlloc. Если соседние блоки мешают расширению данного блока до тре-
буемого размера, в результате выполнения функции HeapReAlloc() возникает
ошибка. Флаг HEAP_REALLOC_IN_PLACE_ONLY обычно применяется в соче-
тании с другими флагами.
     Если выделенный блок памяти больше не нужен, освободите его с помо-
щью функции HeapFree(). Если же отсутствует необходимость и в самой куче,
освободите ее посредством функции HeapDestroy():
   BOOL HeapFree
    (HANDLE hHeap,          // дескриптор локальной кучи
    DWORD dwFlags,         // не используется (должен быть равен нулю)
    LPSTR lpMem,      // адрес освобождаемого блока памяти);…
BOOL HeapDestroy( HANDLE hHeap);…

    Освобождение блока памяти не приводит к отмене закрепления страниц,
которые он занимал, однако это пространство становится доступным для по-
следующих выделений из той же динамической области памяти. Функция
HeapDestroy() освобождает все страницы кучи, независимо от наличия в ней
выделенных блоков. После выполнения функции HeapDestroy() дескриптор
hHeap становится недействительным (неопределенным).
    Еще один набор функций предназначен для проверки правильности ука-

                                     56