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

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

Pro, Premium e Ultimate

Argomento non applicabile Argomento non applicabile Argomento non applicabile

Solo nativo

Argomento non applicabile

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

Altre risorse

Scrittura di funzioni hook di debug