Операционные системы. Учебное пособие. Марапулец Ю.В. - 119 стр.

UptoLike

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

Если создать динамическую область памяти объемом 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