Функция VirtualFree либо только освобождает физическую память, находящуюся под страницей, либо выполняет еще и снятие резервирования переводя страницу в состояние свободное. Страница должна быть расположена в виртуальном адресном пространстве вызывающего процесса.
Для того, чтобы освободить страницу памяти в виртуальном адресном пространнстве другого, выделенную при помощи функции VirtualAllocEx процесса необходимо произвести вызов функции VirtualFreeEx.
function VirtualFree( lpAddress: Pointer; // начальный адрес освобожаемого региона памяти dwSize: DWORD; // размер освобождаемого региона памяти dwFreeType: DWORD // способ освобождения ): BOOL; stdcall;
Параметры
lpAddress [in]
Указатель на начальный базовый адрес, начиная с которого будет происходить
освобождение памяти. Если параметр dwFreeType содержит флаг MEM_RELEASE, то это
значение должно быть возвращено функцией
VirtualAlloc при резервировании памяти.
dwSize [in]
Указывает размер освобождаемого региона в байтах. Если параметр dwFreeType
содержит флаг MEM_RELEASE, то значение этого параметра необходимо установить в
нуль. В противном случае будет снята физическая память со всех страниц
региона памяти, которые полностью либо частично содержаться внутри
диапазона от lpAddress до lpAddress + dwSize. В этом случае возможно
освобождение двух страниц, память на которых будет использована не
полностью (в начале и в конце).
dwFreeType [in]
Указывает способ освобождения памяти. Указанный параметр может быть комбинацией
следующих флагов:
| Флаг | Назначение |
|---|---|
| MEM_DECOMMIT |
Производить освобождение физической памяти, находящейся под страницами указанного региона. Попытка освободит физическую память с уже освобожденных страниц не приводит к ошибке. Это означает что вы можете оснять физическую память с целого диапаона страниц, часть из которых имеют под собой физическую память, а часть из которых ее не имеют, и это будет корректно обработано.
|
| MEM_RELEASE |
Снимает резервирование с указанного региона. В случае, если указан этот параметр, значение параметра dwSize должно быт равным нулю, в противном случае фукнция закончиться неудачей. |
Возвращаемое значение
С случае удачного завершения функция возвращает True.
В случае ошибки функция возвратит False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.
Описание
Функция VirtualFree позволяет выполнять следующие операции:
Освобождаемые страницы должны быть ранее выделены при помощи вызова функции VirtualAlloc. Попытка чтения/записи по диапазону адресов, на которых находятся освобожденные страницы приведет к исключению нарушения доступа.
Фунция VirtualFree может успешно снимать физическую память с тех страниц, которые не имеют под собой физической памяти. Это дает возможность снимать физическую память с целого региона страниц не заботясь о том, какие из страниц этого региона имеют под вобой физическую память, а какие ее не имеют. После снятия памяти содержимое страницы ниде более не сохраняется - ни в опреативной памяти, ни в файле подкачки. Если было произведено снятие физической памяти, но не было снятие резервирования, то страница остается зарезервированной и можно опять передать ей физическую память вызовом VirtualAlloc. Попытка чтения/записи по адресам занимаемыми зарезервированными страницами, которые не имеют под собой физической памяти, приводит к исключению нарушения доступа (access violation).
Текущее состояние каждой страницы должно быть совместимо со способом освобождения, который указывается в параметре dwFreeType. Если это не выполнятеся, то никакого освобождения памяти не происходит и функция заканчивается неудачей.
Требования
Windows NT/2000: Требуется Windows NT 3.1 или более поздняя версия
Windows 95/98: Требуется Windows 95 или более поздняя версия
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
VirtualAllocEx |
VirtualFreeEx![]() |
© Mystic, 2002