HeapFree-Funktion (heapapi.h)

Gibt einen Speicherblock frei, der von einem Heap durch die HeapAlloc - oder HeapReAlloc-Funktion zugeordnet wird.

Syntax

BOOL HeapFree(
  [in] HANDLE                 hHeap,
  [in] DWORD                  dwFlags,
  [in] _Frees_ptr_opt_ LPVOID lpMem
);

Parameter

[in] hHeap

Ein Handle für den Heap, dessen Speicherblock freigegeben werden soll. Dieses Handle wird entweder von der HeapCreate- oder getProcessHeap-Funktion zurückgegeben.

[in] dwFlags

Die heapfreien Optionen. Wenn Sie den folgenden Wert angeben, wird der entsprechende Wert überschrieben, der im flOptions-Parameter angegeben wurde, wenn der Heap mit der HeapCreate-Funktion erstellt wurde.

Wert Bedeutung
HEAP_NO_SERIALIZE
0x00000001
Der serialisierte 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 im Aufruf von HeapCreate HEAP_NO_SERIALIZE an. In diesem Fall ist es nicht erforderlich, HEAP_NO_SERIALIZE in diesem Funktionsaufruf zusätzlich anzugeben.

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

[in] lpMem

Ein Zeiger auf den freizugebenden Speicherblock. Dieser Zeiger wird von der HeapAlloc - oder HeapReAlloc-Funktion zurückgegeben. Dieser Zeiger kann NULL sein.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.

Wenn die Funktion fehlerhaft ist, ist der Rückgabewert null. Eine Anwendung kann GetLastError für erweiterte Fehlerinformationen aufrufen.

Hinweise

Sie sollten in keiner Weise auf Speicher verweisen, der von HeapFree freigegeben wurde. Nachdem dieser Speicher freigegeben wurde, sind alle Informationen, die möglicherweise darin enthalten waren, für immer weg. Wenn Sie Informationen benötigen, geben Sie keinen Arbeitsspeicher frei, der die Informationen enthält. Funktionsaufrufe, die Informationen zum Arbeitsspeicher zurückgeben (z. B. HeapSize), dürfen nicht mit freigegebenem Arbeitsspeicher verwendet werden, da sie möglicherweise falsche Daten zurückgeben. Das zweimalige Aufrufen von HeapFree mit demselben Zeiger kann zu Heapbeschädigungen führen, was dazu führt, dass bei nachfolgenden Aufrufen von HeapAlloc zweimal derselbe Zeiger zurückgegeben wird.

Durch die Serialisierung wird ein gegenseitiger Ausschluss sichergestellt, wenn zwei oder mehr Threads versuchen, gleichzeitig Blöcke aus demselben Heap zuzuweisen oder frei zu geben. Die Serialisierung verursacht geringe Leistungskosten, muss jedoch immer verwendet werden, wenn mehrere Threads Arbeitsspeicher aus demselben Heap zuweisen und freigeben. Das Festlegen des HEAP_NO_SERIALIZE Werts beseitigt den gegenseitigen Ausschluss auf dem Heap. Ohne Serialisierung können zwei oder mehr Threads, die dasselbe Heaphandle verwenden, versuchen, gleichzeitig Arbeitsspeicher zuzuweisen oder freizugeben, was wahrscheinlich zu Einer Beschädigung des Heaps führt. Der HEAP_NO_SERIALIZE-Wert kann daher nur in den folgenden Situationen sicher verwendet werden:

  • Der Prozess verfügt nur über 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 bietet einen eigenen Mechanismus für den gegenseitigen Ausschluss in einen bestimmten Heap.

Beispiele

Ein Beispiel finden Sie unter Abrufen von Prozessheaps.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows XP [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile heapapi.h (windows.h einschließen)
Bibliothek Kernel32.lib
DLL Kernel32.dll

Siehe auch

Heapfunktionen

HeapAlloc

HeapReAlloc

Speicherverwaltungsfunktionen

In VBS-Enclaves verfügbare Vertdll-APIs