Hook di allocazione e allocazioni di memoria di runtime C
Le informazioni contenute in questo argomento sono valide per:
Edizione |
Visual Basic |
C# |
F# |
C++ |
Web Developer |
---|---|---|---|---|---|
Express |
Solo nativo |
||||
Pro, Premium e Ultimate |
Solo nativo |
Una restrizione molto importante che riguarda le funzioni hook di allocazione è che esse devono esplicitamente ignorare i blocchi _CRT_BLOCK (le allocazioni di memoria effettuate internamente dalle funzioni dalla libreria di runtime del linguaggio C) se tali blocchi effettuano chiamate a funzioni della libreria di runtime del linguaggio C che allocano memoria interna. È possibile far sì che i blocchi _CRT_BLOCK vengano ignorati includendo, all'inizio della funzione hook di allocazione, un codice del seguente tipo:
if ( nBlockUse == _CRT_BLOCK )
return( TRUE );
Se la funzione hook di allocazione non ignora i blocchi _CRT_BLOCK, qualsiasi funzione della libreria di runtime del linguaggio C chiamata nella funzione hook rischia di intrappolare il programma in un ciclo senza termine. Ad esempio, printf crea un'allocazione interna. Se il codice hook chiama printf, l'allocazione effettuata farà sì che la funzione hook venga nuovamente chiamata ed essa chiamerà a sua volta nuovamente printf e così via fino all'overflow dello stack. Se è necessario segnalare le operazioni di allocazione _CRT_BLOCK, un modo per ovviare a questa limitazione consiste nell'utilizzare funzioni API Windows, anziché funzioni di runtime del linguaggio C, per la formattazione e l'output. Dal momento che le API Windows non utilizzano l'heap della libreria di runtime del linguaggio C, esse non bloccheranno la funzione hook di allocazione in un ciclo senza termine.
Se si esaminano i file di origine della libreria di runtime, si noterà che la funzione hook di allocazione predefinita, CrtDefaultAllocHook (che restituisce semplicemente TRUE) si trova in un file separato, DBGHOOK.C. Se si desidera che l'hook di allocazione venga chiamato anche per le allocazioni effettuate dal codice di avvio di runtime, che viene eseguito prima della funzione main dell'applicazione, è possibile sostituire questa funzione predefinita con una personalizzata, anziché utilizzare _CrtSetAllocHook.
Vedere anche
Attività
Esempio crt_dbg2: funzioni hook di debug del runtime del linguaggio C