Funzione VirtualFree (memoryapi.h)

Rilascia, decommits o rilascia e decommette un'area di pagine all'interno dello spazio indirizzi virtuale del processo chiamante.

Per liberare memoria allocata in un altro processo dalla funzione VirtualAllocEx , usare la funzione VirtualFreeEx .

Sintassi

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

Parametri

[in] lpAddress

Puntatore all'indirizzo di base dell'area delle pagine da liberare.

Se il parametro dwFreeType è MEM_RELEASE, questo parametro deve essere l'indirizzo di base restituito dalla funzione VirtualAlloc quando l'area delle pagine è riservata.

[in] dwSize

Dimensioni dell'area di memoria da liberare, in byte.

Se il parametro dwFreeType è MEM_RELEASE, questo parametro deve essere 0 (zero). La funzione libera l'intera area riservata nella chiamata di allocazione iniziale a VirtualAlloc.

Se il parametro dwFreeType è MEM_DECOMMIT, la funzione decommette tutte le pagine di memoria che contengono uno o più byte nell'intervallo dal parametro lpAddress a (lpAddress+dwSize). Ciò significa, ad esempio, che un'area a 2 byte di memoria che straddlea un limite di pagina causa la decommessa di entrambe le pagine. Se lpAddress è l'indirizzo di base restituito da VirtualAlloc e dwSize è 0 (zero), la funzione decommette l'intera area allocata da VirtualAlloc. Successivamente, l'intera area si trova nello stato riservato.

[in] dwFreeType

Tipo di operazione gratuita. Questo parametro deve essere uno dei valori seguenti.

Valore Significato
MEM_DECOMMIT
0x00004000
Decommits l'area specificata delle pagine commit. Dopo l'operazione, le pagine si trovano nello stato riservato.

La funzione non riesce se si tenta di decommettere una pagina non commessa. Ciò significa che è possibile decommettere un intervallo di pagine senza prima determinare lo stato di impegno corrente.

Il valore MEM_DECOMMIT non è supportato quando il parametro lpAddress fornisce l'indirizzo di base per un enclave. Questo vale per le enclave che non supportano la gestione dinamica della memoria (ad esempio SGX1). Le enclave SGX2 consentono MEM_DECOMMIT ovunque nell'enclave.

MEM_RELEASE
0x00008000
Rilascia l'area specificata di pagine o segnaposto (per un segnaposto, lo spazio degli indirizzi viene rilasciato e disponibile per altre allocazioni). Dopo questa operazione, le pagine si trovano nello stato libero.

Se si specifica questo valore, dwSize deve essere 0 (zero) e lpAddress deve puntare all'indirizzo di base restituito dalla funzione VirtualAlloc quando l'area è riservata. La funzione ha esito negativo se una di queste condizioni non viene soddisfatta.

Se le pagine nell'area vengono sottoposte a commit, la funzione viene prima decommits e quindi le rilascia.

La funzione non riesce se si tenta di rilasciare pagine in stati diversi, alcune riservate e alcune di cui è stato eseguito il commit. Ciò significa che è possibile rilasciare un intervallo di pagine senza prima determinare lo stato di impegno corrente.

Quando si usa MEM_RELEASE, questo parametro può inoltre specificare uno dei valori seguenti.

Valore Significato
MEM_COALESCE_PLACEHOLDERS
0x00000001
Per unire due segnaposto adiacenti, specificare MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS. Quando si coalesce segnaposto, lpAddress e dwSize devono corrispondere esattamente all'intervallo complessivo dei segnaposto da unire.
MEM_PRESERVE_PLACEHOLDER
0x00000002
Libera un'allocazione a un segnaposto (dopo aver sostituito un segnaposto con un'allocazione privata usando VirtualAlloc2 o Virtual2AllocFromApp).

Per dividere un segnaposto in due segnaposto, specificare MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è diverso da zero.

Se la funzione ha esito negativo, il valore restituito è 0 (zero). Per informazioni dettagliate sull'errore, chiamare GetLastError.

Commenti

Ogni pagina di memoria in uno spazio indirizzi virtuale del processo ha uno stato di pagina. La funzione VirtualFree può decommettere un intervallo di pagine in diversi stati, alcuni commit e alcuni non inviati. Ciò significa che è possibile decommettere un intervallo di pagine senza prima determinare lo stato di impegno corrente di ogni pagina. Il decommettimento di una pagina rilascia l'archiviazione fisica, in memoria o nel file di paging su disco.

Se una pagina viene decommessa ma non rilasciata, lo stato viene modificato in modo riservato. Successivamente, è possibile chiamare VirtualAlloc per eseguirne il commit o VirtualFree per rilasciarlo. I tentativi di lettura o scrittura in una pagina riservata comportano un'eccezione di violazione di accesso.

La funzione VirtualFree può rilasciare un intervallo di pagine in diversi stati, alcune riservate e alcune di cui è stato eseguito il commit. Ciò significa che è possibile rilasciare un intervallo di pagine senza prima determinare lo stato di impegno corrente di ogni pagina. L'intera gamma di pagine originariamente riservate dalla funzione VirtualAlloc deve essere rilasciata contemporaneamente.

Se viene rilasciata una pagina, lo stato viene modificato gratuitamente ed è disponibile per le operazioni di allocazione successive. Dopo che la memoria viene rilasciata o decommitata, non è mai possibile fare riferimento alla memoria. Tutte le informazioni che potrebbero essere state in quella memoria sono andate per sempre. Il tentativo di lettura o scrittura in una pagina gratuita comporta un'eccezione di violazione di accesso. Se è necessario mantenere le informazioni, non decommettere o liberare memoria contenente le informazioni.

La funzione VirtualFree può essere usata in un'area AWE di memoria e invalida eventuali mapping di pagine fisiche nell'area quando libera lo spazio degli indirizzi. Tuttavia, la pagina fisica non viene eliminata e l'applicazione può usarle. L'applicazione deve chiamare in modo esplicito FreeUserPhysicalPages per liberare le pagine fisiche. Al termine del processo, tutte le risorse vengono pulite automaticamente.

Windows 10, versione 1709 e successiva e Windows 11: per eliminare l'enclave al termine dell'uso, chiamare DeleteEnclave. Non è possibile eliminare un enclave VBS chiamando la funzione VirtualFree o VirtualFreeEx. È comunque possibile eliminare un enclave SGX chiamando VirtualFree o VirtualFreeEx.

Windows 10, versione 1507, Windows 10, versione 1511, Windows 10, versione 1607 e Windows 10, versione 1703: Per eliminare l'enclave al termine dell'uso, chiamare la funzione VirtualFree o VirtualFreeEx e specificare i valori seguenti:

  • Indirizzo di base dell'enclave per il parametro lpAddress .
  • 0 per il parametro dwSize .
  • MEM_RELEASE per il parametro dwFreeType .

Esempio

Per un esempio, vedere Prenotazione e commit della memoria.

Requisiti

   
Client minimo supportato Windows XP [app desktop | App UWP]
Server minimo supportato Windows Server 2003 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione memoryapi.h (includono Windows.h, Memoryapi.h)
Libreria onecore.lib
DLL Kernel32.dll

Vedere anche

Funzioni di gestione della memoria

Funzioni di memoria virtuale

VirtualFreeEx

API Vertdll disponibili nelle enclave VBS