_CrtSetAllocHook
Instaluje funkcję alokacji zdefiniowaną przez klienta przez podłączenie jej do procesu alokacji pamięci debugowania w czasie wykonywania C (tylko wersja debug).
Składnia
_CRT_ALLOC_HOOK _CrtSetAllocHook(
_CRT_ALLOC_HOOK allocHook
);
Parametry
allocHook
Nowa funkcja alokacji zdefiniowana przez klienta do podłączenia do procesu alokacji pamięci debugowania w czasie wykonywania C.
Wartość zwracana
Zwraca wcześniej zdefiniowaną funkcję punktu zaczepienia alokacji lub NULL
, jeśli allocHook
ma wartość NULL
.
Uwagi
_CrtSetAllocHook
umożliwia aplikacji dołączenie własnej funkcji alokacji do procesu alokacji biblioteki debugowania w czasie wykonywania języka C. W rezultacie, każde wywołanie funkcji alokacji debugowania do przydzielania, ponownego przydzielenia lub zwolnienia bloku pamięci wyzwala wywołanie funkcji podłączania aplikacji. _CrtSetAllocHook
Udostępnia aplikację łatwą metodą testowania sposobu, w jaki aplikacja obsługuje niewystarczające sytuacje pamięci, możliwość badania wzorców alokacji oraz możliwość rejestrowania informacji alokacji na potrzeby późniejszej analizy. Gdy _DEBUG
nie jest zdefiniowana, wywołania do _CrtSetAllocHook
są usuwane podczas przetwarzania wstępnego.
Funkcja _CrtSetAllocHook
instaluje nową funkcję alokacji zdefiniowaną przez klienta określoną w allocHook
pliku i zwraca wcześniej zdefiniowaną funkcję punktu zaczepienia. Poniższy przykład ilustruje, jak powinny być prototypowane zdefiniowane przez klienta funkcje punktu zaczepienia alokacji:
int YourAllocHook( int allocType, void *userData, size_t size,
int blockType, long requestNumber,
const unsigned char *filename, int lineNumber);
Argument allocType
określa typ operacji alokacji (_HOOK_ALLOC
, _HOOK_REALLOC
i _HOOK_FREE
), która wyzwoliła wywołanie funkcji punktu zaczepienia alokacji. Gdy wyzwalający typ alokacji to _HOOK_FREE
, userData
jest wskaźnikiem do sekcji danych użytkownika bloku pamięci, który ma zostać zwolniony. Jednak gdy typ alokacji wyzwalania to _HOOK_ALLOC
lub _HOOK_REALLOC
, userData
jest NULL
to, że blok pamięci nie został jeszcze przydzielony.
size
Określa rozmiar bloku pamięci w bajtach, blockType
wskazuje typ bloku pamięci, requestNumber
jest numerem kolejności alokacji obiektu bloku pamięci, a jeśli jest dostępny, oraz lineNumber
określ nazwę pliku źródłowego i numer wiersza, filename
w którym zainicjowano operację alokacji wyzwalającej.
Po zakończeniu przetwarzania funkcji podłączania, musi ona zwracać wartość logiczną, która wskazuje głównemu procesowi alokacji środowiska uruchomieniowego C sposób kontynuowania. Gdy funkcja haka chce, aby główny proces alokacji był kontynuowany tak, jakby funkcja haka nigdy nie została wywołana, funkcja haka powinna zwrócić TRUE
wartość , co powoduje wykonanie oryginalnej operacji alokacji wyzwalającej. Funkcja haka może zbierać i zapisywać informacje o alokacji na potrzeby późniejszej analizy bez zakłócania bieżącej operacji alokacji lub stanu sterty debugowania.
Gdy funkcja hakowania chce, aby główny proces alokacji był kontynuowany tak, jakby operacja alokacji wyzwalania została wywołana i zakończyła się niepowodzeniem, funkcja haka powinna zwrócić wartość FALSE
. Funkcja haka może symulować szeroką gamę warunków pamięci i debugować stany sterty w celu przetestowania sposobu obsługi każdej sytuacji przez aplikację.
Aby wyczyścić funkcję haka, przekaż NULL
do ._CrtSetAllocHook
Aby uzyskać więcej informacji o tym, jak _CrtSetAllocHook
można używać z innymi funkcjami zarządzania pamięcią lub jak pisać własne funkcje haka zdefiniowane przez klienta, zobacz Debug hook function writing (Pisanie funkcji haka debugowania).
Uwaga
_CrtSetAllocHook
program nie jest obsługiwany w obszarze /clr:pure. Opcje kompilatora /clr:pure i /clr:safe są przestarzałe w programie Visual Studio 2015 i usuwane w programie Visual Studio 2017.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_CrtSetAllocHook |
<crtdbg.h> |
Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
Biblioteki
Debugowanie tylko wersji bibliotek czasu wykonywania języka C.
Przykład
Aby zapoznać się z przykładem korzystania z programu _CrtSetAllocHook
, zobacz crt_dbg2
.