heapValidate 函式 (heapapi.h)

驗證指定的堆積。 函式會掃描堆積中的所有記憶體區塊,並確認堆積管理員所維護的堆積控制結構處於一致狀態。 您也可以使用 HeapValidate 函式來驗證指定堆積內的單一記憶體區塊,而不檢查整個堆積的有效性。

語法

BOOL HeapValidate(
  [in]           HANDLE  hHeap,
  [in]           DWORD   dwFlags,
  [in, optional] LPCVOID lpMem
);

參數

[in] hHeap

要驗證之堆積的句柄。 HeapCreateGetProcessHeap 函式會傳回此句柄。

[in] dwFlags

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

意義
HEAP_NO_SERIALIZE
0x00000001
將不會使用串行化存取。 如需詳細資訊,請參閱<備註>。

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

存取進程預設堆積時,不應該指定此值。 系統可能會在應用程式進程內建立其他線程,例如 CTRL+C 處理程式,以同時存取進程預設堆積。

[in, optional] lpMem

指定堆積內記憶體區塊的指標。 此參數可以是 NULL

如果此參數為 NULL,函式會嘗試驗證 hHeap 所指定的整個堆積。

如果此參數不是 NULL,函式會嘗試驗證 lpMem 所指向的記憶體區塊。 它不會嘗試驗證堆積的其餘部分。

傳回值

如果指定的堆積或記憶體區塊有效,傳回值為非零。

如果指定的堆積或記憶體區塊無效,則傳回值為零。 在設定偵錯的系統上, HeapValidate 函式接著會顯示偵錯訊息,這些訊息描述無效的堆積或記憶體區塊部分,並在硬式編碼斷點停止,以便您可以檢查系統以判斷無效的來源。 HeapValidate 函式不會設定線程的最後一個錯誤值。 此函式沒有擴充的錯誤資訊;請勿呼叫 GetLastError

備註

HeapValidate 函式主要用於偵錯,因為驗證可能耗時。 驗證堆積可能會封鎖其他線程存取堆積,而且可能會降低效能,特別是在對稱多重處理 (SMP) 計算機上。 這些副作用可以持續到 HeapValidate 傳 回為止。

堆積中的每個記憶體區塊都有堆積控制結構,以及堆積整體的堆積。 當您使用 HeapValidate 函式 來驗證完整的堆積時,它會檢查所有這些控制結構是否有一致性。

當您使用 HeapValidate 來驗證堆積內的單一記憶體區塊時,它只會檢查與該專案相關的控制結構。 HeapValidate 只能驗證配置的記憶體區塊。 在釋放的記憶體區塊上呼叫 HeapValidate 將會傳回 FALSE ,因為沒有要驗證的控制結構。

如果您想要驗證 HeapWalk 函式所列舉的堆積元素,您應該只在 PROCESS_HEAP_ENTRY_BUSY PROCESS_HEAP_ENTRY 結構的 wFlags 成員中,呼叫 HeapValidate HeapValidate 會針對未設定此位的所有堆積元素傳回 FALSE

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

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

規格需求

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

另請參閱

堆積函式

HeapCreate

HeapWalk

記憶體管理功能

PROCESS_HEAP_ENTRY