堆積函式

每個進程都有系統提供的預設堆積。 從堆積進行頻繁配置的應用程式可以使用私人堆積來改善效能。

私人堆積是呼叫進程位址空間中一或多個頁面的區塊。 建立私人堆積之後,進程會使用 HeapAllocHeapFree 等函式來管理該堆積中的記憶體。

堆積函式也可以用來管理進程預設堆積中的記憶體,方法是使用 GetProcessHeap 函式所傳回的控制碼。 新的應用程式應該針對此目的使用堆積函式,而不是 全域和本機函 式。

配置自私人堆積的記憶體,以及使用其他記憶體配置函式所配置的記憶體之間沒有任何差異。 如需函式的完整清單,請參閱 記憶體管理函式中的資料表。

注意

執行緒應該只針對執行緒建立和管理的進程預設堆積和私用堆積呼叫堆積函式,並使用 GetProcessHeapHeapCreate 函 式所傳回的控制碼。

 

HeapCreate函式會建立私用堆積物件,呼叫進程可以使用HeapAlloc函式來配置記憶體區塊。 HeapCreate 會指定堆積的初始大小和大小上限。 初始大小會決定最初為堆積配置的已認可、讀取/寫入頁面數目。 大小上限決定保留頁數的總數。 這些頁面會在堆積可以成長的進程虛擬位址空間中建立連續區塊。 如果 HeapAlloc 的要求超過目前認可的頁面大小,假設有可用的實體儲存體,則會自動從此保留空間認可其他頁面。 一旦認可頁面,在終止進程或呼叫 HeapDestroy 函式終結堆積之前,都不會認可這些頁面。

私人堆積物件的記憶體只能供建立它的進程存取。 如果動態連結程式庫 (DLL) 建立私人堆積,它會在呼叫 DLL 之進程的位址空間中執行此動作。 它只能供該程式存取。

HeapAlloc函式會從私用堆積配置指定的位元組數目,並傳回配置區塊的指標。 這個指標可用於 HeapFreeHeapReAllocHeapSizeHeapValidate 函式。

HeapAlloc配置的記憶體無法移動。 HeapAlloc傳回的位址有效,直到釋放或重新配置記憶體區塊為止;記憶體區塊不需要鎖定。

因為系統無法壓縮私人堆積,所以可能會變得分散。 在各種配置大小中配置大量記憶體的應用程式可以使用 低片段堆積 來減少堆積片段。

堆積函式的可能用途是在進程啟動時建立私人堆積,並指定足以滿足進程記憶體需求的初始大小。 如果 呼叫 HeapCreate 函式失敗,進程可能會終止或通知使用者記憶體不足;不過,如果成功,進程就會確保擁有所需的記憶體。

HeapCreate所要求的記憶體不一定是連續的。 HeapAlloc在堆積內配置的記憶體是連續的。 除了 HeapAlloc所配置的記憶體之外,您不應該寫入或讀取堆積中的記憶體,也不應該假設 HeapAlloc配置之兩個記憶體區域之間的任何關聯性。

您不應該以任何方式參考 HeapFree釋放的記憶體。 釋放記憶體之後,任何可能已在其中的資訊永遠消失。 如果您需要資訊,請勿釋放包含資訊的記憶體。 函式呼叫,傳回記憶體 (的資訊,例如 HeapSize) 可能無法與釋放的記憶體搭配使用,因為它們可能會傳回假的資料。

HeapDestroy函式會終結私用堆積物件。 它會解除認可並釋放堆積物件的所有頁面,並讓堆積的控制碼失效。

比較記憶體配置方法