HeapCompact-Funktion (heapapi.h)

Gibt die Größe des größten zugesicherten freien Blocks im angegebenen Heap zurück. Wenn die Heap-Koppieren auf freiem globalen Flag festgelegt ist, klammert diese Funktion auch angrenzende freie Speicherblöcke im Heap zusammen.

Syntax

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

Parameter

[in] hHeap

Ein Handle für den Heap. Dieser Handle wird entweder von der HeapCreate-- oder GetProcessHeap--Funktion zurückgegeben.

[in] dwFlags

Die Heap-Zugriffsoptionen. Dieser Parameter kann der folgende Wert sein.

Wert Bedeutung
HEAP_NO_SERIALIZE
0x00000001
Serialisierter Zugriff wird nicht verwendet.

Weitere Informationen finden Sie in den Hinweisen.

Um sicherzustellen, dass der serialisierte Zugriff für alle Aufrufe dieser Funktion deaktiviert ist, geben Sie HEAP_NO_SERIALIZE im Aufruf von HeapCreatean. In diesem Fall ist es nicht erforderlich, HEAP_NO_SERIALIZE in diesem Funktionsaufruf zusätzlich anzugeben.

Geben Sie diesen Wert beim Zugriff auf den Prozesshap nicht an. Das System kann zusätzliche Threads innerhalb des Prozesses der Anwendung erstellen, z. B. einen STRG+C-Handler, der gleichzeitig auf den Prozesshap zugreift.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert die Größe des größten zugesicherten freien Blocks im Heap in Byte.

Wenn die Funktion fehlschlägt, ist der Rückgabewert null. Rufen Sie GetLastErrorauf, um erweiterte Fehlerinformationen zu erhalten.

Im unwahrscheinlichen Fall, dass im Heap absolut kein Speicherplatz verfügbar ist, ist der Rückgabewert der Funktion null, und GetLastError den Wert NO_ERROR zurückgibt.

Bemerkungen

Die HeapCompact--Funktion ist in erster Linie für das Debuggen nützlich. Ordinarily, the system compacts the heap whenever the heap HeapFree function is called, and the HeapCompact function returns the size of the largest free block in the heap but does not compact the heap any further. Wenn die Heap-Koppierung bei freiem globalen Flags beim Debuggen festgelegt ist, komprimiert das System den Heap nicht und ruft die HeapCompact--Funktion komprimiert den Heap. Weitere Informationen zu globalen Flags finden Sie in der dokumentation GFlags.

Es gibt keine Garantie, dass eine Anwendung erfolgreich einen Speicherblock der Größe zuordnen kann, die von HeapCompact-zurückgegeben wird. Andere Threads oder der Commit-Schwellenwert verhindern möglicherweise eine solche Zuordnung.

Die Serialisierung stellt einen gegenseitigen Ausschluss sicher, wenn zwei oder mehr Threads versuchen, gleichzeitig Blöcke vom selben Heap zuzuweisen oder frei zu machen. Es gibt einen geringen Leistungsaufwand für die Serialisierung, muss jedoch verwendet werden, wenn mehrere Threads Speicher aus demselben Heap zuordnen und freizugeben. Durch festlegen des HEAP_NO_SERIALIZE Werts wird der gegenseitige Ausschluss für den Heap beseitigt. Ohne Serialisierung können zwei oder mehr Threads, die denselben Heap-Handle verwenden, versuchen, gleichzeitig Arbeitsspeicher zuzuweisen oder freizugeben, was wahrscheinlich zu Beschädigungen im Heap führt. Der HEAP_NO_SERIALIZE Wert kann daher nur in den folgenden Situationen sicher verwendet werden:

  • Der Prozess hat nur einen Thread.
  • Der Prozess verfügt über mehrere Threads, aber nur ein Thread ruft die Heapfunktionen für einen bestimmten Heap auf.
  • Der Prozess verfügt über mehrere Threads, und die Anwendung stellt einen eigenen Mechanismus für den gegenseitigen Ausschluss für einen bestimmten Heap bereit.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [Desktop-Apps | UWP-Apps]
mindestens unterstützte Server- Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform- Fenster
Header- heapapi.h (enthalten Windows.h)
Library Kernel32.lib
DLL- Kernel32.dll

Siehe auch

Heap-Funktionen

HeapCreate

HeapValidate

Speicherverwaltungsfunktionen

Vertdll-APIs in VBS-Enklaven