Funzione VirtualFree (memoryapi.h)

Rilascia, decommette 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 di memoria a 2 byte che si allontana da un limite di pagina fa sì che entrambe le pagine vengano decommesse. 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 è nello stato riservato.

[in] dwFreeType

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

Valore Significato
MEM_DECOMMIT
0x00004000
Disattiva l'area specificata delle pagine di cui è stato eseguito il commit. Dopo l'operazione, le pagine si trovano nello stato riservato.

La funzione non riesce se si tenta di decommettere una pagina di cui non è stato eseguito il commit. 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. Ciò 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 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 attualmente viene eseguito il commit di pagine nell'area, la funzione viene prima decomplicata e quindi le rilascia.

La funzione non riesce se si tenta di rilasciare pagine che si trovano 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ò anche specificare uno dei valori seguenti.

Valore Significato
MEM_COALESCE_PLACEHOLDERS
0x00000001
Per unire due segnaposto adiacenti, specificare MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS. Quando si uniscono 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 che si trovano in stati diversi, alcuni di cui è stato eseguito il commit e alcuni di cui non è stato eseguito il commit. 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 la relativa risorsa di archiviazione fisica, in memoria o nel file di paging su disco.

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

La funzione VirtualFree può rilasciare un intervallo di 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 di ogni pagina. L'intero intervallo di pagine originariamente riservato dalla funzione VirtualAlloc deve essere rilasciato contemporaneamente.

Se viene rilasciata una pagina, lo stato diventa libero ed è disponibile per le operazioni di allocazione successive. Dopo il rilascio o la decommissione della memoria, non è mai possibile fare di nuovo riferimento alla memoria. Tutte le informazioni che potrebbero essere state in quella memoria sono andate per sempre. Il tentativo di leggere o scrivere in una pagina libera genera un'eccezione di violazione di accesso. Se è necessario conservare le informazioni, non rimuovere o liberare memoria contenente le informazioni.

La funzione VirtualFree può essere usata in un'area AWE di memoria e invalida eventuali mapping di pagina fisici nell'area quando libera lo spazio indirizzi. Tuttavia, la pagina fisica non viene eliminata e l'applicazione può usarla. 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 successive 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 (include Windows.h, Memoryapi.h)
Libreria onecore.lib
DLL Kernel32.dll

Vedere anche

Funzioni di gestione della memoria

Funzioni di memoria virtuale

VirtualFreeEx