Compartir a través de


Función VirtualFreeEx (memoryapi.h)

Libera, descommite o libera y descommite una región de memoria dentro del espacio de direcciones virtuales de un proceso especificado.

Sintaxis

BOOL VirtualFreeEx(
  [in] HANDLE hProcess,
  [in] LPVOID lpAddress,
  [in] SIZE_T dwSize,
  [in] DWORD  dwFreeType
);

Parámetros

[in] hProcess

Identificador de un proceso. La función libera memoria dentro del espacio de direcciones virtuales del proceso.

El identificador debe tener el derecho de acceso PROCESS_VM_OPERATION. Para obtener más información, consulte Derechos de acceso y seguridad de procesos.

[in] lpAddress

Puntero a la dirección inicial de la región de memoria que se va a liberar.

Si el parámetro dwFreeType es MEM_RELEASE, lpAddress debe ser la dirección base devuelta por la función VirtualAllocEx cuando se reserva la región.

[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, dwSize debe ser 0 (cero). La función libera toda la región reservada en la llamada de asignación inicial a VirtualAllocEx.

Si dwFreeType es MEM_DECOMMIT, la función descommite todas las páginas de memoria que contienen uno o varios bytes en el intervalo desde el 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 VirtualAllocEx y dwSize es 0 (cero), la función descommite toda la región asignada por VirtualAllocEx. 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 ejecuta correctamente, el valor devuelto es un valor 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 VirtualFreeEx puede descommitar un intervalo de páginas que están 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 VirtualAllocEx para confirmarlo o VirtualFreeEx para liberarlo. Si se intenta leer o escribir en una página reservada, se produce una excepción de infracción de acceso.

La función VirtualFreeEx puede liberar un intervalo de páginas que están 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 VirtualAllocEx debe publicarse 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. Los intentos de lectura o escritura en una página gratuita producen 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 VirtualFreeEx 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, las páginas físicas no se eliminan 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 .

Requisitos

Requisito Value
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

VirtualAllocEx