Поделиться через


Функция VirtualFree (memoryapi.h)

Освобождает, снимает или освобождает и удаляет область страниц в виртуальном адресном пространстве вызывающего процесса.

Чтобы освободить память, выделенную в другом процессе функцией VirtualAllocEx , используйте функцию VirtualFreeEx .

Синтаксис

BOOL VirtualFree(
  [in] LPVOID lpAddress,
  [in] SIZE_T dwSize,
  [in] DWORD  dwFreeType
);

Параметры

[in] lpAddress

Указатель на базовый адрес области освобождаемых страниц.

Если параметр dwFreeType имеет MEM_RELEASE, то этот параметр должен быть базовым адресом, возвращаемым функцией VirtualAlloc , когда область страниц зарезервирована.

[in] dwSize

Размер освобождаемой области памяти в байтах.

Если параметр dwFreeType имеет MEM_RELEASE, этот параметр должен иметь значение 0 (ноль). Функция освобождает весь регион, зарезервированный в начальном вызове выделения VirtualAlloc.

Если параметр dwFreeType имеет значение MEM_DECOMMIT, функция удаляет все страницы памяти, содержащие один или несколько байтов в диапазоне от параметра lpAddress до (lpAddress+dwSize). Это означает, например, что 2-байтовая область памяти, которая пронизывает границу страницы, приводит к списанию обеих страниц. Если lpAddress — это базовый адрес, возвращаемый VirtualAlloc , а dwSize — 0 (ноль), функция удаляет весь регион, выделенный VirtualAlloc. После этого весь регион находится в зарезервированном состоянии.

[in] dwFreeType

Тип свободной операции. Этот параметр должен иметь одно из следующих значений.

Значение Значение
MEM_DECOMMIT
0x00004000
Удаляет указанную область зафиксированных страниц. После выполнения операции страницы находятся в зарезервированном состоянии.

Функция не завершается ошибкой при попытке вывести незафиксированную страницу. Это означает, что можно высвоить диапазон страниц без предварительного определения текущего состояния обязательств.

Значение MEM_DECOMMIT не поддерживается, если параметр lpAddress предоставляет базовый адрес для анклава. Это верно для анклавов, которые не поддерживают динамическое управление памятью (например, SGX1). Анклавы SGX2 позволяют MEM_DECOMMIT в любом месте анклава.

MEM_RELEASE
0x00008000
Освобождает указанную область страниц или заполнитель (для заполнителя пространство адресов освобождается и доступно для других выделений). После выполнения этой операции страницы находятся в свободном состоянии.

Если указать это значение, dwSize должно иметь значение 0 (ноль), а lpAddress должно указывать на базовый адрес, возвращаемый функцией VirtualAlloc , когда регион зарезервирован. Функция завершается сбоем, если ни одно из этих условий не выполняется.

Если какие-либо страницы в регионе фиксируются в данный момент, функция сначала удаляется, а затем освобождает их.

Функция не завершается ошибкой при попытке освободить страницы, которые находятся в разных состояниях, некоторые зарезервированы и зафиксированы. Это означает, что можно освободить диапазон страниц без предварительного определения текущего состояния обязательств.

При использовании MEM_RELEASE этот параметр может дополнительно указать одно из следующих значений.

Значение Значение
MEM_COALESCE_PLACEHOLDERS
0x00000001
Чтобы объединить два смежных заполнителя, укажите MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS. При объединии заполнителей lpAddress и dwSize должны точно соответствовать общему диапазону заполнителей для объединения.
MEM_PRESERVE_PLACEHOLDER
0x00000002
Освобождает выделение обратно в заполнитель (после замены заполнителя частным выделением с помощью VirtualAlloc2 или Virtual2AllocFromApp).

Чтобы разделить заполнитель на два заполнителя, укажите MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER.

Возвращаемое значение

Если функция выполняется успешно, возвращается ненулевое значение.

Если функция завершается сбоем, возвращается значение 0 (ноль). Дополнительные сведения об ошибке можно получить, вызвав GetLastError.

Комментарии

Каждая страница памяти в виртуальном адресном пространстве процесса имеет состояние страницы. Функция VirtualFree может выводить из эксплуатации диапазон страниц, которые находятся в разных состояниях, некоторые из которых зафиксированы, а некоторые — незафиксированы. Это означает, что можно высвоить диапазон страниц без предварительного определения текущего состояния обязательств для каждой страницы. При выводе страницы из эксплуатации ее физическое хранилище освобождается в памяти или в файле подкачки на диске.

Если страница была списана, но не освобождена, ее состояние изменится на зарезервированное. Затем можно вызвать VirtualAlloc , чтобы зафиксировать его, или VirtualFree , чтобы освободить его. Попытки чтения с зарезервированной страницы или записи на нее приводят к исключению нарушения доступа.

Функция VirtualFree может освободить диапазон страниц, которые находятся в разных состояниях, некоторые зарезервированы и зафиксированы. Это означает, что можно освободить диапазон страниц без предварительного определения текущего состояния обязательств для каждой страницы. Весь диапазон страниц, изначально зарезервированных функцией VirtualAlloc , должен быть освобожден одновременно.

Если страница освобождена, ее состояние изменяется на бесплатную и становится доступной для последующих операций выделения. После освобождения или списания памяти вы никогда не сможете снова обратиться к ней. Любая информация, которая могла быть в этой памяти, исчезнет навсегда. Попытка чтения с бесплатной страницы или записи на нее приводит к исключению нарушения доступа. Если необходимо сохранить сведения, не снимайте и не освобождайте память, содержащую эти сведения.

Функция VirtualFree может использоваться в области памяти AWE и делает недействительными любые сопоставления физических страниц в этом регионе при освобождении адресного пространства. Однако физическая страница не удаляется, и приложение может использовать их. Приложение должно явно вызвать FreeUserPhysicalPages , чтобы освободить физические страницы. После завершения процесса все ресурсы очищаются автоматически.

Windows 10 версии 1709 и более поздних версий и Windows 11. Чтобы удалить анклав после его использования, вызовите Метод DeleteEnclave. Вы не можете удалить анклав VBS, вызвав функцию VirtualFree или VirtualFreeEx . Вы по-прежнему можете удалить анклав SGX, вызвав VirtualFree или VirtualFreeEx.

Windows 10 версии 1507, Windows 10, версии 1511, Windows 10 версии 1607 и Windows 10 версии 1703. Чтобы удалить анклав после его использования, вызовите функцию VirtualFree или VirtualFreeEx и укажите следующие значения:

  • Базовый адрес анклава для параметра lpAddress .
  • 0 для параметра dwSize .
  • MEM_RELEASE для параметра dwFreeType .

Примеры

Пример см. в разделе Резервирование и фиксация памяти.

Требования

   
Минимальная версия клиента Windows XP [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2003 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header memoryapi.h (включая Windows.h, Memoryapi.h)
Библиотека onecore.lib
DLL Kernel32.dll

См. также

Функции управления памятью

Функции виртуальной памяти

VirtualFreeEx

API-интерфейсы Vertdll, доступные в анклавах VBS