_CrtSetAllocHook
Installiert eine clientdefinierte Zuordnungsfunktion, indem sie mit dem C-Laufzeit-Debugspeicherbelegungsprozess verknüpft wird (nur Debugversion).
Syntax
_CRT_ALLOC_HOOK _CrtSetAllocHook(
_CRT_ALLOC_HOOK allocHook
);
Parameter
allocHook
Die neue clientdefinierte Zuordnungsfunktion, die mit dem C-Laufzeit-Debugspeicherbelegungsprozess verknüpft werden soll.
Rückgabewert
Gibt die zuvor definierte Zuordnungshookfunktion oder NULL
zurück, wenn allocHook
den Wert NULL
hat.
Hinweise
_CrtSetAllocHook
ermöglicht es einer Anwendung, eine eigene Zuordnungsfunktion in den Speicherbelegungsprozess der C-Laufzeit-Debugbibliothek einzubinden. Daher löst jeder Aufruf einer Debugzuordnungsfunktion für die Belegung, erneute Belegung oder Freigabe eines Speicherblocks einen Aufruf der Hookfunktion der Anwendung aus. Die _CrtSetAllocHook
-Funktion bietet einer Anwendung eine einfache Methode, mit der getestet werden kann, wie die Anwendung Speichermangel behandelt. Darüber hinaus erhält die Anwendung die Möglichkeit, Reservierungsmuster zu überprüfen und Reservierungsinformationen für die spätere Analyse zu protokollieren. Wenn _DEBUG
nicht definiert ist, werden Aufrufe von _CrtSetAllocHook
während der Vorverarbeitung entfernt.
Die _CrtSetAllocHook
-Funktion installiert die neue clientdefinierte Zuordnungsfunktion, die in allocHook
angegeben ist, und gibt die zuvor definierte Hookfunktion zurück. Das folgende Beispiel zeigt, wie ein Prototyp einer clientdefinierten Hookfunktion für Zuordnungen entwickelt werden soll:
int YourAllocHook( int allocType, void *userData, size_t size,
int blockType, long requestNumber,
const unsigned char *filename, int lineNumber);
Das allocType
Argument gibt den Typ des Zuordnungsvorgangs (_HOOK_ALLOC
, und _HOOK_FREE
) an, _HOOK_REALLOC
der den Aufruf der Hook-Funktion der Zuordnung ausgelöst hat. Wenn der Typ der auslösenden Zuordnung vom Typ _HOOK_FREE
ist, ist userData
ein Zeiger zum Benutzerdatenabschnitt des freizugebenden Speicherblocks. Wenn der auslösende Zuordnungstyp jedoch liegt _HOOK_ALLOC
oder _HOOK_REALLOC
liegt daran, userData
NULL
dass der Speicherblock noch nicht zugewiesen wurde.
size
gibt die Größe des Speicherblocks in Bytes an, blockType
den Typ des Speicherblocks, requestNumber
ist die Befehlsnummer der Objektzuordnung für den Speicherblock, und filename
und lineNumber
, sofern verfügbar, geben den Quelldateinamen und die Zeilennummer an, in der die auslösende Zuordnung initiiert wurde.
Nachdem die Hookfunktion verarbeitet wurde, muss sie einen booleschen Wert zurückgeben, der den C-Laufzeit-Hauptzuordnungsprozess anweist, wie das Verfahren fortgesetzt werden soll. Wenn die Hook-Funktion den Hauptzuweisungsprozess fortsetzen möchte, als ob die Hook-Funktion nie aufgerufen wurde, sollte die Hook-Funktion zurückgegeben TRUE
werden, was dazu führt, dass der ursprüngliche auslösende Zuordnungsvorgang ausgeführt wird. Die Hook-Funktion kann Zuordnungsinformationen für spätere Analysen sammeln und speichern, ohne den aktuellen Zuordnungsvorgang oder den Zustand des Debug-Heaps zu beeinträchtigen.
Wenn die Hookfunktion den Hauptzuordnungsprozess anweist, das Verfahren so fortzusetzen, als ob das auslösende Zuordnungsverfahren aufgerufen wurde und fehlgeschlagen ist, sollte die Hookfunktion den Wert FALSE
zurückgeben. Die Hook-Funktion kann eine vielzahl von Speicherbedingungen simulieren und Heapzustände debuggen, um zu testen, wie die Anwendung jede Situation behandelt.
Um die Hookfunktion zu löschen, leiten Sie NULL
an _CrtSetAllocHook
weiter.
Weitere Informationen _CrtSetAllocHook
zur Verwendung mit anderen Speicherverwaltungsfunktionen oder zum Schreiben eigener clientdefinierter Hookfunktionen finden Sie im Schreiben von Debug-Hook-Funktionen.
Hinweis
_CrtSetAllocHook
wird unter "/clr:pure" nicht unterstützt. Die Optionen "/clr:pure " und "/clr:safe compiler" sind in Visual Studio 2015 veraltet und werden in Visual Studio 2017 entfernt.
Anforderungen
Routine | Erforderlicher Header |
---|---|
_CrtSetAllocHook |
<crtdbg.h> |
Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Libraries
Nur Debugversionen von C-Laufzeitbibliotheken
Beispiel
Ein Beispiel für die Verwendung _CrtSetAllocHook
finden Sie unter crt_dbg2
.