Составители:
Если создать динамическую область памяти объемом 2 Мб и попытаться выделить из
нее два блока размером по 1 Мб каждый, второй блок, скорее всего, не будет выделен.
Изменить размер блока после его выделения позволяет функция HeapReAlloc.
LPSTR HeapReAlloc( HANDLE, hHeap, // дескриптор локальной кучи
DWORD dwFlags, // флаги, влияющие на перераспределение памяти
LPSTR lpMem, // адрес блока памяти, размер которого изменяется
DWORD dwBytes ); // новый размер выделенного блока памяти
Кроме двух флагов, которые функция HeapAllос использовала для обнуления па-
мяти и для генерации исключений, параметр dwFlags функции HeapReAlloc принимает
еще один флаг - HEAP_REALLOC_IN_PLACE_ONLY. (Microsoft заботится о том, чтобы
мы все понимали, объединив целых пять слов в имени одной-единственной константы.)
Этот флаг предотвращает перемещение выделенного блока в более свободную область
памяти, выполняемое функцией HeapReAlloc. Если соседние блоки мешают расшире-
нию данного блока до требуемого размера, в результате выполнения функции HeapReAl-
loc возникает ошибка. Флаг HEAP_REALLOC_IN_PLACE_ONLY обычно применяется в
сочетании с другими флагами.
Если выделенный блок памяти больше не нужен, освободите его с помощью функ-
ции HeapFree. Если же отсутствует необходимость и в самой куче, освободите ее по-
средством функции HeapDestroy.
BOOL HeapFree( HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // не используется (должен быть равен нулю)
LPSTR lpMem ); // адрес освобождаемого блока памяти
BOOL HeapDestroy( HANDLE hHeap ) ;
Освобождение блока памяти не приводит к отмене закрепления страниц, которые
он занимал, однако это пространство становится доступным для последующих выделе-
ний из той же динамической области памяти. Функция HeapDestroy освобождает все
страницы кучи, независимо от наличия в ней выделенных блоков. После выполнения
функции HeapDestroy дескриптор hHeap становится недействительным (неопределен-
ным).
Еще один набор функций предназначен для проверки правильности указателей
(табл. 4.2). Каждая функция из этого набора получает виртуальный адрес и возвращает
значение TRUE,
если процесс не имеет определенных привилегий доступа.
Таблица 4.2
Функция Аргумент Вид проверки
IsBadCodePtr Указатель функции Проверяет возможность чтения начала функции
IsBadReadPtr Указатель блока па-
мяти
Проверяет возможность чтения заданного диа-
пазона адресов
IsBadStringPtr Указатель строки Проверяет возможность чтения всех байтов до
конца заданной строки
IsBadWritePtr Указатель блока па-
мяти
Проверяет возможность записи заданного диа-
пазона адресов
121
Если создать динамическую область памяти объемом 2 Мб и попытаться выделить из
нее два блока размером по 1 Мб каждый, второй блок, скорее всего, не будет выделен.
Изменить размер блока после его выделения позволяет функция HeapReAlloc.
LPSTR HeapReAlloc( HANDLE, hHeap, // дескриптор локальной кучи
DWORD dwFlags, // флаги, влияющие на перераспределение памяти
LPSTR lpMem, // адрес блока памяти, размер которого изменяется
DWORD dwBytes ); // новый размер выделенного блока памяти
Кроме двух флагов, которые функция HeapAllос использовала для обнуления па-
мяти и для генерации исключений, параметр dwFlags функции HeapReAlloc принимает
еще один флаг - HEAP_REALLOC_IN_PLACE_ONLY. (Microsoft заботится о том, чтобы
мы все понимали, объединив целых пять слов в имени одной-единственной константы.)
Этот флаг предотвращает перемещение выделенного блока в более свободную область
памяти, выполняемое функцией HeapReAlloc. Если соседние блоки мешают расшире-
нию данного блока до требуемого размера, в результате выполнения функции HeapReAl-
loc возникает ошибка. Флаг HEAP_REALLOC_IN_PLACE_ONLY обычно применяется в
сочетании с другими флагами.
Если выделенный блок памяти больше не нужен, освободите его с помощью функ-
ции HeapFree. Если же отсутствует необходимость и в самой куче, освободите ее по-
средством функции HeapDestroy.
BOOL HeapFree( HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // не используется (должен быть равен нулю)
LPSTR lpMem ); // адрес освобождаемого блока памяти
BOOL HeapDestroy( HANDLE hHeap ) ;
Освобождение блока памяти не приводит к отмене закрепления страниц, которые
он занимал, однако это пространство становится доступным для последующих выделе-
ний из той же динамической области памяти. Функция HeapDestroy освобождает все
страницы кучи, независимо от наличия в ней выделенных блоков. После выполнения
функции HeapDestroy дескриптор hHeap становится недействительным (неопределен-
ным).
Еще один набор функций предназначен для проверки правильности указателей
(табл. 4.2). Каждая функция из этого набора получает виртуальный адрес и возвращает
значение TRUE, если процесс не имеет определенных привилегий доступа.
Таблица 4.2
Функция Аргумент Вид проверки
IsBadCodePtr Указатель функции Проверяет возможность чтения начала функции
IsBadReadPtr Указатель блока па- Проверяет возможность чтения заданного диа-
мяти пазона адресов
IsBadStringPtr Указатель строки Проверяет возможность чтения всех байтов до
конца заданной строки
IsBadWritePtr Указатель блока па- Проверяет возможность записи заданного диа-
мяти пазона адресов
121
Страницы
- « первая
- ‹ предыдущая
- …
- 117
- 118
- 119
- 120
- 121
- …
- следующая ›
- последняя »
