Hookfunktionen für Reservierungen
Aktualisiert: November 2007
Dieses Thema gilt für folgende Anwendungsbereiche:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
![]() |
![]() |
Nur "Systemeigen" |
![]() |
Standard |
![]() |
![]() |
Nur "Systemeigen" |
![]() |
Pro und Team |
![]() |
![]() |
Nur "Systemeigen" |
![]() |
Tabellenlegende:
![]() |
Vorhanden |
![]() |
Nicht vorhanden |
![]() |
Befehl oder Befehle, die standardmäßig ausgeblendet sind. |
Eine mithilfe von _CrtSetAllocHook installierte Hookfunktion für Reservierungen wird jedes Mal aufgerufen, wenn Speicher reserviert, erneut reserviert 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.
![]() |
---|
Beachten Sie die Einschränkungen hinsichtlich der Verwendung von C-Laufzeitbibliotheksfunktionen in einer Reservierungshookfunktion. Siehe dazu Reservierungshooks und Speicherreservierungen 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 reserviert wurde, und gibt FALSE zurück, wenn die Reservierung 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