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 |
---|---|
|
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. |
|
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 |
---|---|
|
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.
|
|
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 |
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 |