Heapfunktionen

Jeder Prozess verfügt über einen vom System bereitgestellten Standardheap. Anwendungen, die häufige Zuordnungen über den Heap vornehmen, können die Leistung verbessern, indem sie private Heaps verwenden.

Ein privater Heap ist ein Block aus mindestens einer Seite im Adressraum des aufrufenden Prozesses. Nach dem Erstellen des privaten Heaps verwendet der Prozess Funktionen wie HeapAlloc und HeapFree , um den Arbeitsspeicher in diesem Heap zu verwalten.

Die Heapfunktionen können auch zum Verwalten des Arbeitsspeichers im Standardheap des Prozesses mithilfe des von der GetProcessHeap-Funktion zurückgegebenen Handle verwendet werden. Neue Anwendungen sollten zu diesem Zweck die Heapfunktionen anstelle der globalen und lokalen Funktionen verwenden.

Es gibt keinen Unterschied zwischen dem von einem privaten Heap zugewiesenen Speicher und dem, der mithilfe der anderen Speicherzuordnungsfunktionen zugewiesen wird. Eine vollständige Liste der Funktionen finden Sie in der Tabelle unter Speicherverwaltungsfunktionen.

Hinweis

Ein Thread sollte heap-Funktionen nur für die standardmäßigen Heaps und privaten Heaps des Prozesses aufrufen, die vom Thread erstellt und verwaltet werden, wobei die von der GetProcessHeap - oder HeapCreate-Funktion zurückgegebenen Handles verwendet werden.

 

Die HeapCreate-Funktion erstellt ein privates Heapobjekt, aus dem der aufrufende Prozess Speicherblöcke mithilfe der HeapAlloc-Funktion zuordnen kann. HeapCreate gibt sowohl eine Anfangsgröße als auch eine maximale Größe für den Heap an. Die anfängliche Größe bestimmt die Anzahl der committen Seiten mit Lese-/Schreibzugriff, die anfänglich für den Heap zugewiesen wurden. Die maximale Größe bestimmt die Gesamtzahl der reservierten Seiten. Diese Seiten erstellen einen zusammenhängenden Block im virtuellen Adressraum eines Prozesses, in den der Heap hineinwachsen kann. Zusätzliche Seiten werden automatisch aus diesem reservierten Bereich gebunden, wenn Anforderungen von HeapAlloc die aktuelle Größe der committeten Seiten überschreiten, vorausgesetzt, dass der physische Speicher dafür verfügbar ist. Sobald die Seiten committet wurden, werden sie erst aufgehoben, wenn der Prozess beendet wird oder bis der Heap durch Aufrufen der HeapDestroy-Funktion zerstört wird.

Auf den Arbeitsspeicher eines privaten Heapobjekts kann nur der Prozess zugreifen, der es erstellt hat. Wenn eine Dynamic Link Library (DLL) einen privaten Heap erstellt, erfolgt dies im Adressraum des Prozesses, der die DLL aufgerufen hat. Sie ist nur für diesen Prozess zugänglich.

Die HeapAlloc-Funktion weist eine angegebene Anzahl von Bytes aus einem privaten Heap zu und gibt einen Zeiger auf den zugeordneten Block zurück. Dieser Zeiger kann in den Funktionen HeapFree, HeapReAlloc, HeapSize und HeapValidate verwendet werden.

Der von HeapAlloc zugewiesene Arbeitsspeicher ist nicht verschiebbar. Die von HeapAlloc zurückgegebene Adresse ist gültig, bis der Speicherblock freigegeben oder neu zugewiesen wurde. Der Speicherblock muss nicht gesperrt werden.

Da das System einen privaten Heap nicht komprimieren kann, kann er fragmentiert werden. Anwendungen, die große Mengen an Arbeitsspeicher in verschiedenen Zuordnungsgrößen zuweisen, können den Heap mit geringer Fragmentierung verwenden, um die Heapfragmentierung zu reduzieren.

Eine mögliche Verwendung für die Heapfunktionen besteht darin, einen privaten Heap zu erstellen, wenn ein Prozess gestartet wird, wobei eine anfängliche Größe angegeben wird, die ausreicht, um die Arbeitsspeicheranforderungen des Prozesses zu erfüllen. Wenn der Aufruf der HeapCreate-Funktion fehlschlägt, kann der Prozess beenden oder den Benutzer über den Speichermangel benachrichtigen. wenn es erfolgreich ist, ist der Prozess jedoch sicher, dass er über den benötigten Arbeitsspeicher verfügt.

Der von HeapCreate angeforderte Arbeitsspeicher kann oder nicht zusammenhängend sein. Der von HeapAlloc in einem Heap zugeordnete Arbeitsspeicher ist zusammenhängend. Sie sollten in einem Heap nicht in den Arbeitsspeicher schreiben oder aus diesem lesen, außer dem, der von HeapAlloc zugeordnet ist, noch sollten Sie von einer Beziehung zwischen zwei Speicherbereichen ausgehen, die von HeapAlloc zugewiesen wurden.

Sie sollten sich in keiner Weise auf Speicher beziehen, der von HeapFree freigegeben wurde. Nachdem der Speicher freigegeben wurde, sind alle Informationen, die möglicherweise darin enthalten waren, für immer verschwunden. Wenn Sie Informationen benötigen, geben Sie keinen Speicher frei, der die Informationen enthält. Funktionsaufrufe, die Informationen zum Arbeitsspeicher zurückgeben (z. B. HeapSize), können nicht mit freigegebenem Arbeitsspeicher verwendet werden, da sie möglicherweise gefälschte Daten zurückgeben.

Die HeapDestroy-Funktion zerstört ein privates Heapobjekt. Es hebt alle Seiten des Heapobjekts auf und gibt sie frei, und das Handle wird für den Heap ungültig.

Vergleichen von Speicherzuordnungsmethoden