winbase.h


VirtualAlloc

[Nuevo - Windows NT]

La función VirtualFreeEx libera o desasigna (o ambas) una región de páginas dentro del espacio de direcciones virtual del proceso especificado.

La diferencia entre las funciones VirtualFreeEx y VirtualFree es que esta última libera memoria dentro del espacio de direcciones del proceso que la invoca, mientras que VirtualFreeEx permite especificar un proceso.

Sintaxis

BOOL VirtualFreeEx(
    HANDLE hProcess,   // proceso del que se va a liberar memoria
    LPVOID lpAddress,  // dirección de la región de páginas asignadas
    DWORD dwSize,      // tamaño de la región en bytes
    DWORD dwFreeType   // tipo de operación de liberado
   );

Parámetros

hProcess: manipulador de un proceso. La función libera memoria dentro del espacio virtual de direcciones de este proceso.

Se debe tener el acceso PROCESS_VM_OPERATION para este proceso. Si no se tiene, la función falla.

lpAddress: puntero a la dirección base de la región de páginas a liberar.

Si la bandera MEM_RELEASE está activa en el parámetro dwFreeType, lpAddress debe ser la dirección base devuelta por la función VirtualAllocEx cuando la región de páginas fue reservada.

dwSize: especifica el tamaño, en bytes, de la región a liberar.

Si el parámetro dwFreeType incluye la bandera MEM_RELEASE flag, este parámetro debe ser cero. Esta función libera la región entera que fue reservada en la llamada de acomodo inicial a VirtualAllocEx.

Si la bandera MEM_DECOMMIT está activa, la función desasigna todas las páginas de memoria que contengan un byte o más en el rango entre lpAddress y (lpAddress+dwSize). Esto significa, por ejemplo, que un rango de dos bytes a caballo en un límite de página hace que ambas páginas sean desasignadas.

La función desasigna la región entera que fue reservada por VirtualAllocEx. Si se cumplen las tres condiciones siguientes:

  • Que la bandera MEM_DECOMMIT esté activa.
  • Que lpAddress sea la dirección base devuelta por la función VirtualAllocEx cuando la región fue reservada.
  • Que dwSize sea cero.

La región completa pasa a estado reservado.

flAllocationType: especifica el tipo de operación de liberación. Se debe especificar una de las dos banderas siguientes:

Bandera Significado
MEM_DECOMMIT Desasigna una región especificada de páginas. Las páginas pasan al estado de reservadas.
La función no falla si se intenta desasignar una página asignada. Esto significa que se puede desasignar un rango de páginas sin determinar previamente si están actualmente en el estado de asignadas.
MEM_RELEASE La función libera la región de páginas especificada. Las páginas pasan a estado libre.
Si se especifica esta bandera, dwSize debe ser cero, y lpAddress debe apuntar a la dirección devuelta por la función VirtualAllocEx cuando la región fue reservada. La función fallará si cualquiera de estas condiciones no se cumple.
Si cualquiera de las páginas de la región está actualmente asignada, la función primero la desasigna y después la libera.
La función no falla si se intenta liberar páginas que estén en estados diferentes, algunas reservadas y otras asignadas. Esto significa que se puede liberar un rango de páginas sin determinar previamente si actualmente están asignadas.

Valor de retorno

Si la función tiene éxito, el valor de retorno es distinto de cero.

Si la función falla, el valor de retorno es cero. Para obtener información más detallada sobre el error, llamar a la función GetLastError.

Observaciones

Cada página de memoria en el espacio de direcciones virtual de un proceso está en uno de estos tres estados:

Estado Significado
Libre La página no está asignada ni reservada y no es accesible para el proceso. Un intento de leer o escribir en una página libre provoca una excepción de violación de acceso.
Se puede usar VirtualFreeEx para poner en estado libre páginas reservadas o asignadas.
Reservada La página está reservada. El rango de direcciones no puede ser usado por otras funciones de acomodo. La página no es accesible y no tiene almacenamiento físico asociado con ella. Un intento de leer o escribir en una página reservada produce una excepción de violación de acceso.
Se puede usar la función VirtualFreeEx para poner páginas de memoria asignadas en el estado reservado, y para poner una página reservada en estado libre.
Asignada La página está asignada. Hay almacenamiento físico asignado en memoría o en el fichero de paginación para esta página, y el acceso está controlado por un código de protección.
El sistema operativo inicializa y carga cada página asignada en memoria física sólo en el primer intento de lectura o escritura de la página.
Cuando el proceso termina, el sistema operativo libera el almacenamiento de las páginas asignadas.
Se puede usar VirtualAllocEx para poner páginas de memoria asignadas tanto en el estado reservado como libre.

VirtualFreeEx puede realizar las operaciones siguientes:

  • Desasignar una región de páginas asignadas o no asignadas. Después de esta operación, las páginas estarán en estado reservado.
  • Liberar una región de páginas reservadas. Después de esta operación, las páginas pasan al estado libre.
  • Desasignar y liberar una región de páginas asignadas o no asignadas. Después de esta operación las páginas pasan al estado libre.

La función VirtualFreeEx puede desasignar un rango de páginas que estén en estados diferentes, algunas asignadas y otras no asignadas. Esto significa que se puede desasignar un rango de páginas sin necesidad de determinar primero el estado actual de asignación de cada página. Desasignar una página libera si almacenamiento físico, tanto en memoria como en el fichero de paginación de disco.

Si una página es desasignada pero no liberada, su estado cambia a reservada. Se puede llamar después a VirtualAllocEx para asignarla o a VirtualFreeEx para liberarla. Un intento de leer o escribir en una página reservada provoca una excepción de violación de acceso.

La función VirtualFreeEx puede liberar un rango de páginas que estén en estados diferentes, algunas reservadas y otras asignadas. Esto significa que se puede liberar un rango de páginas sin necesidad de determinar primero el estado actual de asignación de cada página. El rango completo de páginas originalmente reservadas por la función VirtualAllocEx debe ser liberado al mismo tiempo.

Si una página es liberada, su estado cambia a libre, y estará disponible para nuevas operaciones de acomodo. Un intento de leer o escribir en una página libre produce una excepción de violación de acceso.