VirtualFree 函式 (memoryapi.h)

釋放、取消認可或釋放,並取消認可呼叫程式虛擬位址空間內的頁面區域。

若要釋放 VirtualAllocEx 函式在另一個進程中配置的記憶體,請使用 VirtualFreeEx 函 式。

語法

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

參數

[in] lpAddress

要釋放之頁面區域的基位址指標。

如果 dwFreeType 參數 MEM_RELEASE,當保留頁面的區域時,此參數必須是 VirtualAlloc 函式所傳回的基位址。

[in] dwSize

要釋放的記憶體區域大小,以位元組為單位。

如果 dwFreeType 參數 MEM_RELEASE,則這個參數必須是 0 (零) 。 函式會釋放 VirtualAlloc 初始配置呼叫中保留的整個區域。

如果 dwFreeType 參數 MEM_DECOMMIT,函式會將範圍中包含一或多個字節的所有記憶體分頁取消認可,從 lpAddress 參數到 (lpAddress+dwSize)。 例如,這表示跨越頁面界限的 2 位元組記憶體區域會導致這兩個頁面被認可。 如果 lpAddressVirtualAlloc 傳回的基位址, 而 dwSize 為 0 (零) ,則函式會取消認可 VirtualAlloc 所配置的整個區域。 之後,整個區域會處於保留狀態。

[in] dwFreeType

可用作業的類型。 此參數必須是下列其中一個值。

意義
MEM_DECOMMIT
0x00004000
取消認可已認可頁面的指定區域。 作業之後,頁面會處於保留狀態。

如果您嘗試取消認可未認可的頁面,此函式不會失敗。 這表示您可以取消認可一系列頁面,而不需要先判斷目前的承諾用量狀態。

lpAddress 參數提供記憶體保護區的基位址時,不支援MEM_DECOMMIT值。 這適用於不支援動態記憶體管理 (的記憶體保護區,也就是SGX1) 。 SGX2 記憶體保護區允許 MEM_DECOMMIT 記憶體保護區中的任何位置。

MEM_RELEASE
0x00008000
釋放佔位元的指定頁面區域或佔位元 (,位址空間會釋出,並可用於其他配置) 。 此作業之後,頁面會處於免費狀態。

如果您指定此值, dwSize 必須是 0 (零) ,而 lpAddress 必須指向保留區域時 VirtualAlloc 函式所傳回的基位址。 如果不符合上述任一條件,此函式就會失敗。

如果區域中的任何頁面目前已認可,函式會先取消認可,然後釋放它們。

如果您嘗試釋放處於不同狀態的頁面,則函式不會失敗,部分保留和一些已認可。 這表示您可以釋放一系列頁面,而不需要先判斷目前的承諾用量狀態。

使用 MEM_RELEASE 時,此參數可以另外指定下列其中一個值。

意義
MEM_COALESCE_PLACEHOLDERS
0x00000001
若要聯合兩個相鄰的佔位元,請指定 MEM_RELEASE | MEM_COALESCE_PLACEHOLDERS。 當您聯合佔位元符時, lpAddressdwSize 必須完全符合要合併之佔位符的整體範圍。
MEM_PRESERVE_PLACEHOLDER
0x00000002
使用 VirtualAlloc2 或 Virtual2AllocFromApp) 取代佔位符之後,將配置釋放回佔位元 (。

若要將佔位元分割成兩個佔位元元,請指定 MEM_RELEASE | MEM_PRESERVE_PLACEHOLDER

傳回值

如果函式成功,則傳回非零的值。

如果函式失敗,傳回值為 0 (零) 。 若要取得擴充的錯誤資訊,請呼叫 GetLastError

備註

進程虛擬位址空間中的每個記憶體頁面都有 頁面狀態VirtualFree 函式可以取消認可處於不同狀態、某些已認可和某些未認可的頁面範圍。 這表示您可以取消認可一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 取消認可頁面會在記憶體或磁碟上的分頁檔案中釋放其實體記憶體。

如果頁面已取消認可但未發行,其狀態會變更為保留。 接著,您可以呼叫 VirtualAlloc 來認可它,或 呼叫 VirtualFree 來釋放它。 嘗試讀取或寫入保留頁面會導致存取違規例外狀況。

VirtualFree 函式可以釋放處於不同狀態、部分保留和一些已認可的頁面範圍。 這表示您可以釋放一系列頁面,而不需要先判斷每個頁面的目前承諾用量狀態。 VirtualAlloc 函式原本保留的整個頁面範圍必須同時釋放。

如果發行頁面,其狀態會變更為可用,而且可用於後續的配置作業。 釋放或解除認可記憶體之後,您永遠不能再次參考記憶體。 任何可能在該記憶體中的資訊都永遠消失。 嘗試讀取或寫入免費頁面會導致存取違規例外狀況。 如果您需要保留資訊,請勿取消認可或釋放包含資訊的記憶體。

VirtualFree 函式可用於記憶體的 AWE 區域,並在釋放地址空間時使區域中的任何實體頁面對應失效。 不過,不會刪除實體頁面,而且應用程式可以使用它們。 應用程式必須明確呼叫 FreeUserPhysicalPages 以釋放實體頁面。 當進程終止時,會自動清除所有資源。

Windows 10 版本 1709 和更新版本和 Windows 11:若要在完成使用記憶體保護區時刪除記憶體保護區,請呼叫 DeleteEnclave。 您無法藉由呼叫 VirtualFree 或 VirtualFreeEx 函來刪除 VBS 記憶體保護區。 您仍然可以呼叫 VirtualFree 或 VirtualFreeEx 來刪除 SGX 記憶體保護區

Windows 10 版本 1507、Windows 10 版本 1511、Windows 10 版本 1607 和 Windows 10 1703:若要在完成使用記憶體保護區時刪除記憶體保護區,請呼叫 VirtualFree 或 VirtualFreeEx 函式並指定下列值:

  • lpAddress 參數記憶體保護區的基位址。
  • 0 表示 dwSize 參數。
  • dwFreeType 參數MEM_RELEASE

範例

如需範例,請參閱 保留和認可記憶體

規格需求

   
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 memoryapi.h (包括 Windows.h、Memoryapi.h)
程式庫 onecore.lib
DLL Kernel32.dll

另請參閱

記憶體管理功能

虛擬記憶體函式

VirtualFreeEx

VBS 記憶體保護區中可用的 Vertdll API