Función VirtualFree (memoryapi.h)

Libera, descommite o libera y descommite una región de páginas dentro del espacio de direcciones virtuales del proceso de llamada.

Para liberar memoria asignada en otro proceso por la función VirtualAllocEx , use la función VirtualFreeEx .

Sintaxis

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

Parámetros

[in] lpAddress

Puntero a la dirección base de la región de las páginas que se van a liberar.

Si el parámetro dwFreeType es MEM_RELEASE, este parámetro debe ser la dirección base devuelta por la función VirtualAlloc cuando se reserva la región de las páginas.

[in] dwSize

Tamaño de la región de memoria que se va a liberar, en bytes.

Si el parámetro dwFreeType es MEM_RELEASE, este parámetro debe ser 0 (cero). La función libera toda la región reservada en la llamada de asignación inicial a VirtualAlloc.

Si el parámetro dwFreeType es MEM_DECOMMIT, la función descommite todas las páginas de memoria que contienen uno o varios bytes en el intervalo del parámetro lpAddress a (lpAddress+dwSize). Esto significa, por ejemplo, que una región de 2 bytes de memoria que extiende un límite de página hace que ambas páginas se descommitan. Si lpAddress es la dirección base devuelta por VirtualAlloc y dwSize es 0 (cero), la función descommite toda la región asignada por VirtualAlloc. Después de eso, toda la región está en estado reservado.

[in] dwFreeType

Tipo de operación libre. Este parámetro puede ser uno de los siguientes valores.

Value Significado
MEM_DECOMMIT
0x00004000
Descommite la región especificada de las páginas confirmadas. Después de la operación, las páginas están en estado reservado.

La función no produce un error si intenta descommitar una página sin confirmar. Esto significa que puede descommitr un intervalo de páginas sin determinar primero el estado de compromiso actual.

El valor de MEM_DECOMMIT no se admite cuando el parámetro lpAddress proporciona la dirección base para un enclave. Esto es así para enclaves que no admiten la administración de memoria dinámica (es decir, SGX1). Los enclaves SGX2 permiten MEM_DECOMMIT en cualquier lugar del enclave.

MEM_RELEASE
0x00008000
Libera la región especificada de páginas o marcador de posición (para un marcador de posición, el espacio de direcciones se libera y está disponible para otras asignaciones). Después de esta operación, las páginas quedan en el estado libre.

Si especifica este valor, dwSize debe ser 0 (cero) y lpAddress debe apuntar a la dirección base devuelta por la función VirtualAlloc cuando se reserva la región. Se produce un error en la función si no se cumple cualquiera de estas condiciones.

Si se confirma actualmente alguna página de la región, la función se descommite primero y, a continuación, las libera.

La función no produce un error si intenta liberar páginas que están en diferentes estados, algunas reservadas y otras confirmadas. Esto significa que puede liberar un intervalo de páginas sin determinar primero el estado de compromiso actual.

Al usar MEM_RELEASE, este parámetro también puede especificar uno de los valores siguientes.

Valor Significado
MEM_COALESCE_PLACEHOLDERS
0x00000001
Para fusionar dos marcadores de posición adyacentes, especifique MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS. Cuando se combinan marcadores de posición, lpAddress y dwSize deben coincidir exactamente con el intervalo general de los marcadores de posición que se van a combinar.
MEM_PRESERVE_PLACEHOLDER
0x00000002
Libera una asignación a un marcador de posición (después de reemplazar un marcador de posición por una asignación privada mediante VirtualAlloc2 o Virtual2AllocFromApp).

Para dividir un marcador de posición en dos marcadores de posición, especifique MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER.

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si la función no se realiza correctamente, el valor devuelto es 0 (cero). Para obtener información de error extendida, llame a GetLastError.

Comentarios

Cada página de memoria de un espacio de direcciones virtuales de proceso tiene un estado de página. La función VirtualFree puede descommitar un intervalo de páginas que se encuentran en diferentes estados, algunos confirmados y algunos no confirmados. Esto significa que puede descommitr un intervalo de páginas sin determinar primero el estado de compromiso actual de cada página. Al omitir una página, se libera su almacenamiento físico, ya sea en memoria o en el archivo de paginación en el disco.

Si se descommite una página pero no se libera, su estado cambia a reservado. Posteriormente, puede llamar a VirtualAlloc para confirmarlo o VirtualFree para liberarlo. Los intentos de lectura o escritura en una página reservada producen una excepción de infracción de acceso.

La función VirtualFree puede liberar un intervalo de páginas que se encuentran en diferentes estados, algunos reservados y algunos confirmados. Esto significa que puede liberar un intervalo de páginas sin determinar primero el estado de compromiso actual de cada página. El intervalo completo de páginas reservadas originalmente por la función VirtualAlloc debe liberarse al mismo tiempo.

Si se libera una página, su estado cambia a gratis y está disponible para las operaciones de asignación posteriores. Una vez que se libere o se descommita la memoria, nunca podrá volver a hacer referencia a la memoria. Cualquier información que pueda haber estado en esa memoria se ha ido para siempre. Si se intenta leer o escribir en una página gratuita, se produce una excepción de infracción de acceso. Si necesita mantener la información, no descommita ni libere memoria que contenga la información.

La función VirtualFree se puede usar en una región de AWE de memoria y invalida las asignaciones de páginas físicas de la región al liberar el espacio de direcciones. Sin embargo, la página física no se elimina y la aplicación puede usarlas. La aplicación debe llamar explícitamente a FreeUserPhysicalPages para liberar las páginas físicas. Cuando finaliza el proceso, todos los recursos se limpian automáticamente.

Windows 10, versión 1709 y posteriores y Windows 11: para eliminar el enclave cuando termine de usarlo, llame a DeleteEnclave. No se puede eliminar un enclave de VBS llamando a la función VirtualFree o VirtualFreeEx . Todavía puede eliminar un enclave SGX llamando a VirtualFree o VirtualFreeEx.

Windows 10, versión 1507, Windows 10, versión 1511, Windows 10, versión 1607 y Windows 10, versión 1703: para eliminar el enclave cuando termine de usarlo, llame a la función VirtualFree o VirtualFreeEx y especifique los valores siguientes:

  • Dirección base del enclave para el parámetro lpAddress .
  • 0 para el parámetro dwSize .
  • MEM_RELEASE para el parámetro dwFreeType .

Ejemplos

Para obtener un ejemplo, consulte Reservación y confirmación de memoria.

Requisitos

   
Cliente mínimo compatible Windows XP [aplicaciones de escritorio | aplicaciones para UWP]
Servidor mínimo compatible Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP]
Plataforma de destino Windows
Encabezado memoryapi.h (incluya Windows.h, Memoryapi.h)
Library onecore.lib
Archivo DLL Kernel32.dll

Consulte también

Funciones de administración de memoria

Funciones de memoria virtual

VirtualFreeEx

API de Vertdll disponibles en enclaves de VBS