Freigeben über


RtlAllocateHeap-Funktion (ntifs.h)

Die RtlAllocateHeap- Routine weist einen Speicherblock von einem Heap zu.

Syntax

NTSYSAPI PVOID RtlAllocateHeap(
  [in]           PVOID  HeapHandle,
  [in, optional] ULONG  Flags,
  [in]           SIZE_T Size
);

Parameter

[in] HeapHandle

Handle für einen privaten Heap, von dem der Speicher zugewiesen wird. Dieser Parameter ist ein Handle, das von einem erfolgreichen Aufruf von RtlCreateHeap zurückgegeben wird.

[in, optional] Flags

Kontrollierbare Aspekte der Heap-Zuordnung. Wenn Sie einen dieser Werte angeben, wird der entsprechende Wert außer Kraft gesetzt, der beim Erstellen des Heaps mit RtlCreateHeap-angegeben wurde. Dieser Parameter kann einen oder mehrere der folgenden Werte sein.

Flagge Bedeutung
HEAP_GENERATE_EXCEPTIONS Das System löst eine Ausnahme aus, um einen Funktionsfehler anzugeben, z. B. eine Nichtspeicherbedingung, anstatt NULL-zurückzugeben.
HEAP_NO_SERIALIZE Der gegenseitige Ausschluss wird nicht verwendet, während RtlAllocateHeap- auf den Heap zugreift.
HEAP_ZERO_MEMORY Der zugewiesene Arbeitsspeicher wird auf Null initialisiert. Andernfalls wird der Arbeitsspeicher nicht auf Null initialisiert.

[in] Size

Anzahl der zuzuordnenden Bytes. Wenn der heap, der durch den parameter HeapHandle angegeben wird, ein nicht wachsender Heap ist, muss Size kleiner oder gleich dem virtuellen Speicherschwellenwert des Heaps sein. (Weitere Informationen finden Sie im VirtualMemoryThreshold Member des Parameters Parameter zum RtlCreateHeap-.)

Rückgabewert

Wenn der Aufruf von RtlAllocateHeap erfolgreich ist, ist der Rückgabewert ein Zeiger auf den neu zugewiesenen Block. Der Rückgabewert ist NULL, wenn die Zuordnung fehlgeschlagen ist.

Bemerkungen

RtlAllocateHeap einen Speicherblock der angegebenen Größe aus dem angegebenen Heap zuordnet.

Um einen Speicherblock freizugeben, der von RtlAllocateHeap-zugewiesen wird, rufen Sie RtlFreeHeap-auf.

Der von RtlAllocateHeap zugeordnete Speicher ist nicht verschiebbar. Da der Speicher nicht verschiebbar ist, ist es möglich, dass der Heap fragmentiert wird.

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 wert HEAP_NO_SERIALIZE 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.

Anmerkung

Verwenden Sie zum Schutz vor einer Zugriffsverletzung die strukturierte Ausnahmebehandlung, um code zu schützen, der in einen Heap schreibt oder liest. Weitere Informationen zur strukturierten Ausnahmebehandlung mit Speicherzugriffen finden Sie unter Behandeln von Ausnahmen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP
Zielplattform- Universal
Header- ntifs.h (einschließlich Ntifs.h)
Library NtosKrnl.lib
DLL- NtosKrnl.exe
IRQL- < DISPATCH_LEVEL

Siehe auch

RtlCreateHeap-

RtlDestroyHeap

RtlFreeHeap-