Функция VirtualFreeEx позволяет снимать резервирование, снимать физическую память либо одновменно снимать резервирование и физическую память в виртуальном адресном пространстве указанного процесса.
function VirtualFreeEx( hProcess: THandle; lpAddress: Pointer; dwSize: DWORD dwFreeType: DWORD ): Bool1 ; stdcall;
Параметры
hProcess [in]
Дескриптор процесса. Функция произведет освобоождение памяти в виртуальном
адресном пространстве именно этого процесса.
Важно! Вы должны иметь атрибуты доступа PROCESS_VM_OPERATION к указанному процессу. В противном случае функция вернет признак ошибки.
lpAddress [in]
Указатель на начальный базовый адрес, начиная с которого будет происходить
освобождение памяти.
Если параметр dwFreeType содержит флаг MEM_RELEASE, то это значение должно быть возвращено функцией VirtualAllocEx при резервировании памяти.
dwSize [in]
Указывает размер освобождаемого региона в байтах.
Если параметр dwFreeType содержит флаг MEM_RELEASE, то значение этого параметра необходимо установить в нуль. В этом случае произодет освобождение блока памяти, ранее зарезервированного вызовом функции VirtualAllocEx.
Если параметр dwFreeType содержит флаг MEM_DECOMMIT, то происходит снятие физической памяти всех страницы региона памяти, которые либо полностью, либо частично содержаться внутри диапазона от lpAddress до lpAddress + dwSize. В этом случае возможно освобождение двух страниц, которые содержаться не полностью в указанном диапазоне (в начале и в конце ).
Необходимо, чтобы все страницы указанного лиапазона были зарезервированы. При этом в случае сняти резервирования параметр dwSize должен быть равен нулю, а lpAddress должен быть равен значению, которое было возвращено функцией VirtualAllocEx выполявшей резервирование данного региона.
dwFreeType [in]
Указывает способ освобождения ранее выделенной памяти. Этот параметр должен
принимать одно из следующих значений:
| Флаг | Назначение |
|---|---|
| MEM_DECOMMIT |
Функция снимает физическую память со страниц указанного диапазона. Каждая из страниц указанного диапазона становиться зарезрвированной. Функция выполниться успешно даже в случае попытки снятия физической памяти со страниц, которые ее под собой не имеют. Это означает, что вы можете производить снятие физической памяти из диапазона страниц, не заботясь о том, какие из страниц указанного диапазона имеют под собой физическую память, а какие нет. |
| MEM_RELEASE |
Функция освобождает страницы указанного диапазона. Каждая из страниц указанного диапазона получает статус свободной. С этим флагом вы можете указать значение dsSize равным нулю. При этом параметр lpAddress должен быть равен указателю на начало базового адреса, который был возвращен функцией VirtulAllocEx. В этом случае будет произведено освобождение памяти, которое раннее было выделено при помощи соответсвующего вызова VirtulAllocEx. Функция вернет ошибку, если хотя бы одно из этих условий не выполнено. Если под некоторыми страницами освобождаемого региона находилась физическая память, то перед освобождением страниц будет предварительно произведено снятие физическо йпамяти с таких страниц. Функция выполнится успешно даже в том случае, когда страницы указанного диапазона имеют разный статус (зарезервированные или с выделенной физической памятью). Это означает, что вы моете производить освобождение памяти не волнуясь о том, какой статус имеют страницы указанного региона. |
Возвращаемое значение
В случае удачного завершения функция возвращает ненулевое значение.
В случае ошибки функция вернут нуль. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.
Описание
Каждая из страниц виртуального адресного пространства процес может находится в одном из следующих состояний:
| Состояние страницы | Описание |
|---|---|
| Свободная |
Страница памяти не является ни зарезервированной, ни выделенной, и в настоящее время недоступна. Попытки чтения/записи в укзанную страницу вызовут нарушение доступа. Вы можете изпользовать функция VirtualFreeEx для того, чтобы перевести выделенные либо зарезервированные страницы в состояние свободных. |
| Зарезервированная |
Страница памяти виртуального адресного пространства процеса зарезервирована для будущего использования. Процесс не имеет доступа к зарезервированной странице памяти, и ей не отвечает физическая память. Попытки чтения/записи в укзанную страницу вызовут нарушение доступа. Вы можете изпользовать функция VirtualFreeEx для того, чтобы перевести выделенные страницы в состояние зарезервировано, либо для того, чтобы перевести зарезервированные страницы в состояние свободно. |
| Переданная процессу |
Страница называется переданной процесу, если ей соответствует некоторая страница физической памяти (или на диске). Она может быть защищена от всякого доступа к ней, быть доступной только для чтения, или быть доступной как для чтния, так и для записи. Система инициализирует выделенные страницы только после первой попытки чтения или записи в указанную страницу. По завершении процесса система освобождает все выделенные ним страницы памяти. Процесс должен использовать вызов функции VirtualAllocEx для того, чтобы передать странице физическую память, при этом ранее страница должна находиться либо в свободном, либо в зарезервированном состоянии. |
Функция VirtualFreeEx позволяет выполнять следующие операции:
Функция VirtualFreeEx позволяет снять физическую память с диапазона страниц, внутри которого могут находиться как страницы, имеющие под сбой физическую память, так и страницы, которые не имеют под собой физической памяти. Это означает, что вы можете снять физическую память с диапазона страниц, при этом не проверяя, выделена ли физическая память под каждой конкретной страницей указанного диапазона или нет. Страницы, под которыми нет физической памяти, не занимают места как в оперативной памяти, так и в файле подкачки.
Освобождаемые страницы должны быть ранее выделены при помощи вызова функции VirtualAllocEx. Попытка чтения/записи по диапазону адресов, на которых находятся освобожденные страницы приведет к исключению нарушения доступа.
Функция VirtualFreeEx позволяет освободить диапазона страниц, внутри которого могут находиться как страницы, имеющие под собой физическую память, так и страницы, которые зарезерыированы. Это означает, что вы можете освободить память, при этом не проверяя, выделена ли физическая память под каждой конкретной страницей или же страница зарезервирована. Таким образом вы можете освободить страницы в физической памяти, которые ранее были зарезервированы при помощи вызова VirtualAllocEx.
Если страница освобождена (находиться в свободном состоянии), то она доступна для всех операций выделения памяти. Если страница освобождена, или же с нее снята физическая память, то вы не пожете к ней обрщаться. Любая информация, которая находилась на таких страницах, является потерянной. Попытка чтения или записи с таких страниц вызывает ошибку нарушения доступа. Если вам необходима информация, хранящаяся на странце памяти, то ее не следует освобождать или снимать с нее физическую память.
Требования
Windows NT/2000: Требуется Windows NT 4.0 или более поздняя версия
Windows 95/98: Не поддерживается
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
VirtualFree |
VirtualLock![]() |
© Mystic, 2002
1) В Delphi 6 в модуле Windows.pas функция VirtualFreeEx ошибочно определена как функция, возвращающая значение типа Pointer.