堆積函式
每個進程都有系統提供的預設堆積。 從堆積進行頻繁配置的應用程式可以使用私人堆積來改善效能。
私人堆積是呼叫進程位址空間中一或多個頁面的區塊。 建立私人堆積之後,此進程會使用 HeapAlloc 和 HeapFree 等函式來管理該堆積中的記憶體。
堆積函式也可以用來管理進程預設堆積中的記憶體,方法是使用 getProcessHeap函式所傳回的句柄。 新的應用程式應該使用堆積函式,而不是 全域和本機函式, 此目的。
從私人堆積配置的記憶體,以及使用其他記憶體配置函式所配置的記憶體之間沒有任何差異。 如需函式的完整清單,請參閱 記憶體管理函式中的數據表。
注意
線程應該只針對線程建立和管理的預設堆積呼叫堆積函式,並使用 getProcessHeap或 HeapCreate 函式所傳回的句柄。
HeapCreate 函式會建立私人堆積物件,呼叫進程可以使用 HeapAlloc 函式來配置記憶體區塊。 HeapCreate 同時指定堆積的初始大小和大小上限。 初始大小會決定最初為堆積配置的已認可讀取/寫入頁面數目。 大小上限決定保留頁面總數。 這些頁面會在堆積可成長的進程虛擬位址空間中建立連續區塊。 如果 HeapAl loc 的要求超過目前認可的頁面大小,假設有可用的實體記憶體,則會自動從此保留空間認可其他頁面。 一旦認可頁面,它們就不會在進程終止或堆積被終結之前,藉由呼叫 HeapDestroy 函式來終結這些頁面。
私人堆積物件的記憶體只能存取建立它的進程。 如果動態連結庫 (DLL) 建立私人堆積,它會在呼叫 DLL 的進程地址空間中執行此動作。 它只能存取該程式。
HeapAlloc 函式會從私人堆積配置指定的位元組數目,並傳回已配置區塊的指標。 此指標可用於 HeapFree、HeapReAlloc、HeapSize和 HeapValidate 函式中。
HeapAlloc 所配置的記憶體無法移動。 HeapAlloc 傳回的位址有效,直到記憶體區塊釋出或重新配置為止;記憶體區塊不需要鎖定。
因為系統無法壓縮私人堆積,所以可能會變成分散。 以各種配置大小配置大量記憶體的應用程式可以使用 低片段堆積 以減少堆積片段。
堆積函式的可能用法是在進程啟動時建立私人堆積,並指定足以滿足進程記憶體需求的初始大小。 如果呼叫 HeapCreate 函式失敗,進程可能會終止或通知用戶記憶體不足;不過,如果成功,進程就會保證擁有所需的記憶體。
HeapCreate 所要求的記憶體可能或可能不是連續的。 HeapAlloc 在堆積內配置的記憶體是連續的。 除了由 heapAlloc 所設定的,您不應該寫入或讀取堆積中的記憶體,也不應該假設 heapAlloc 所配置兩個記憶體區域之間的任何關聯性。
您不應該以任何方式參考已由 HeapFree釋放的記憶體。 釋放記憶體之後,任何可能已進入它的資訊都永遠消失。 如果您需要資訊,請勿釋放包含資訊的記憶體。 傳回記憶體相關信息的函式呼叫(例如 HeapSize)可能無法與釋放的記憶體搭配使用,因為它們可能會傳回假數據。
HeapDestroy 函式會終結私人堆積物件。 它會認可並釋放堆積物件的所有頁面,並且使堆積的句柄失效。
相關主題