heapCompact 函式 (heapapi.h)

傳回指定堆積中最大認可可用區塊的大小。 如果已設定 [停用可用全域旗標的堆積聯合 ],此函式也會聯合堆積中相鄰的可用記憶體區塊。

語法

SIZE_T HeapCompact(
  [in] HANDLE hHeap,
  [in] DWORD  dwFlags
);

參數

[in] hHeap

堆積的句柄。 HeapCreateGetProcessHeap 函式會傳回此句柄。

[in] dwFlags

堆積存取選項。 此參數可以是下列值。

意義
HEAP_NO_SERIALIZE
0x00000001
將不會使用串行化存取。

如需詳細資訊,請參閱<備註>。

若要確保所有呼叫此函式的串行化存取都停用,請在呼叫 HeapCreate 中指定HEAP_NO_SERIALIZE。 在此情況下,不需要在此函數調用中額外指定 HEAP_NO_SERIALIZE

存取進程堆積時,請勿指定此值。 系統可能會在應用程式進程內建立額外的線程,例如 CTRL+C 處理程式,以同時存取進程堆積。

傳回值

如果函式成功,則傳回值是堆積中最大認可可用區塊的大小,以位元組為單位。

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

在堆積中絕對沒有可用空間的情況下,函式傳回值為零,而 GetLastError 會傳回值NO_ERROR。

備註

HeapCompact 函式主要用於偵錯。 一般而言,每當呼叫 HeapFree 函式時,系統會壓縮堆積, 而 HeapCompact 函式會傳回堆積中最大可用區塊的大小,但不會進一步壓縮堆積。 如果在偵錯期間設定了 [停用堆積聯合 ] 全域旗標,系統就不會壓縮堆積,而呼叫 HeapCompact 函式會壓縮堆積。 如需全域旗標的詳細資訊,請參閱 GFlags 檔。

不保證應用程式可以成功配置 HeapCompact 所傳回大小的記憶體區塊。 其他線程或認可閾值可能會防止這類配置。

當兩個或多個線程嘗試同時配置或釋放相同堆積中的區塊時,串行化可確保互斥。 串行化有一小部分的效能成本,但每當多個線程配置和釋放來自相同堆積的記憶體時,都必須使用它。 設定 HEAP_NO_SERIALIZE 值可排除堆積上的相互排除。 如果沒有串行化,使用相同堆積句柄的兩個或多個線程可能會嘗試同時配置或釋放記憶體,而可能導致堆積損毀。 因此, HEAP_NO_SERIALIZE 值只能在下列情況下安全地使用:

  • 進程只有一個線程。
  • 進程有多個線程,但只有一個線程會呼叫特定堆積的堆積函式。
  • 進程有多個線程,而且應用程式會提供自己的機制,以排除特定堆積。

規格需求

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

另請參閱

堆積函式

HeapCreate

HeapValidate

記憶體管理功能

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