Freigeben über


Hookfunktionen für Reservierungen

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

F#

C++

Web Developer

Express

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Pro, Premium und Ultimate

Thema ist nicht vorhanden Thema ist nicht vorhanden Thema ist nicht vorhanden

Nur "Systemeigen"

Thema ist nicht vorhanden

Eine mithilfe von _CrtSetAllocHook installierte Hookfunktion für Reservierungen wird jedes Mal aufgerufen, wenn Speicher belegt, erneut belegt oder freigegeben wird. Dieser Hooktyp ist vielseitig verwendbar. Sie können damit beispielsweise testen, wie eine Anwendung auf Speichermangel reagiert, Reservierungsmuster überprüfen oder Reservierungsinformationen für die spätere Analyse protokollieren.

Tipp

Beachten Sie die Einschränkungen hinsichtlich der Verwendung von C-Laufzeitbibliotheksfunktionen in einer Reservierungshookfunktion. Siehe dazu Reservierungshooks und Speicherbelegungen von C-Laufzeitbibliotheken.

Der Prototyp einer Reservierungshookfunktion sollte etwa wie folgt aussehen:

int YourAllocHook(int nAllocType, void *pvData,
        size_t nSize, int nBlockUse, long lRequest,
        const unsigned char * szFileName, int nLine )

Der Zeiger, den Sie an _CrtSetAllocHook übergeben, ist vom Typ _CRT_ALLOC_HOOK, wie in CRTDBG.H definiert:

typedef int (__cdecl * _CRT_ALLOC_HOOK)
    (int, void *, size_t, int, long, const unsigned char *, int);

Wenn die Laufzeitbibliothek die Hookfunktion aufruft, wird durch das nAllocType-Argument angegeben, welche Reservierungsoperation (_HOOK_ALLOC, _HOOK_REALLOC oder _HOOK_FREE) ausgeführt werden soll. Bei einer Freigabe oder einer erneuten Reservierung enthält pvData einen Zeiger auf den Benutzerbereich des freizugebenden Blocks. Im Falle einer Reservierung ist dieser Zeiger jedoch NULL, da die Reservierung noch nicht stattgefunden hat. Die übrigen Argumente enthalten die jeweilige Reservierungsgröße, den Blocktyp, die damit verknüpfte, fortlaufende Anforderungsnummer und ggf. einen Zeiger auf den Dateinamen und die Zeilennummer, in der die Reservierung durchgeführt wurde. Nachdem die Hookfunktion die vom Autor vorgesehenen Analysen und sonstigen Aufgaben durchgeführt hat, muss sie entweder TRUE (die Reservierungsoperation kann fortgesetzt werden) oder FALSE (die Reservierungsoperation wird fehlschlagen) zurückgeben. Eine einfache Hookfunktion dieses Typs überprüft beispielsweise, wie viel Speicher bisher belegt wurde, und gibt FALSE zurück, wenn die Belegung ein geringes Maß überschritten hat. In der Anwendung würden dann diejenigen Reservierungsfehler auftreten, die normalerweise vorkommen, wenn sehr wenig Speicher verfügbar ist. Komplexere Hookfunktionen könnten Reservierungsmuster nachverfolgen, die Speichernutzung analysieren oder beim Auftreten bestimmter Situationen eine Meldung ausgeben.

Siehe auch

Aufgaben

crt_dbg2-Beispiel: C-Laufzeit – Debuggen von Hookfunktionen

Konzepte

Reservierungshooks und Speicherreservierungen von C-Laufzeitbibliotheken

Weitere Ressourcen

Schreiben von Hookfunktionen zum Debuggen