Funzione VirtualFreeEx (memoryapi.h)

Rilascia, decommits o rilascia e decommette un'area di memoria all'interno dello spazio indirizzi virtuale di un processo specificato.

Sintassi

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

Parametri

[in] hProcess

Handle a un processo. La funzione libera memoria all'interno dello spazio indirizzi virtuale del processo.

L'handle deve avere il diritto di accesso PROCESS_VM_OPERATION . Per altre informazioni, vedere Elaborare diritti di sicurezza e accesso.

[in] lpAddress

Puntatore all'indirizzo iniziale dell'area di memoria da liberare.

Se il parametro dwFreeType è MEM_RELEASE, lpAddress deve essere l'indirizzo di base restituito dalla funzione VirtualAllocEx quando l'area è riservata.

[in] dwSize

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

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

Se 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 VirtualAllocEx e dwSize è 0 (zero), la funzione decommette l'intera area allocata da VirtualAllocEx. 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 è un valore 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 VirtualFreeEx 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 VirtualAllocEx per eseguirne il commit o VirtualFreeEx per rilasciarlo. Il tentativo di lettura o scrittura in una pagina riservata comporta un'eccezione di violazione di accesso.

La funzione VirtualFreeEx 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'intera gamma di pagine originariamente riservate da VirtualAllocEx deve essere rilasciata contemporaneamente.

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

La funzione VirtualFreeEx 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, le pagine fisiche non vengono eliminate 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 .

Requisiti

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

VirtualAllocEx