Funciones de enlace de asignación

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Una función de enlace de asignación, instalada mediante _CrtSetAllocHook, recibe una llamada cada vez que se asigna, reasigna o libera memoria. Este tipo de enlace se puede utilizar para muchos propósitos diferentes. Utilícelo para probar, por ejemplo, el modo en que una aplicación trata las situaciones de memoria insuficiente, para examinar pautas de asignación o para guardar información de asignación para análisis posteriores.

System_CAPS_ICON_note.jpg Nota

Tenga en cuenta la restricción acerca del uso de funciones de la biblioteca en tiempo de ejecución de C en una función de enlace de asignación, descrita en Enlaces de asignación y asignaciones de memoria en tiempo de ejecución de C.

Una función de enlace de asignación debería tener un prototipo como el siguiente:

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

El puntero que se pasa a _CrtSetAllocHook es del tipo _CRT_ALLOC_HOOK, según se define en CRTDBG.H:

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

Cuando la biblioteca en tiempo de ejecución llama a la función de enlace, el argumento nAllocType indica qué operación de asignación se va a realizar (_HOOK_ALLOC, _HOOK_REALLOC o _HOOK_FREE). En caso de una liberación o reasignación, pvData contiene un puntero al tema de usuario del bloque que se va a liberar. Sin embargo, en el caso de una asignación, este puntero es null, ya que la asignación no se ha producido aún. Los restantes argumentos contienen el tamaño de la asignación, su tipo de bloque, el número de solicitud secuencial asociado con él, así como un puntero al nombre del archivo y número de línea donde se realizó la asignación, si se dispone de él. Después de que la función de enlace realiza las operaciones especificadas por su autor, debe devolver TRUE para indicar que la operación de asignación puede continuar, o bien FALSE, que indica que la operación ha resultado errónea. Un simple enlace de este tipo podría comprobar la cantidad de memoria asignada hasta entonces y devolver FALSE si esa cantidad supera un pequeño límite. La aplicación experimentaría entonces el tipo de errores de asignación que ocurrirían normalmente sólo cuando la memoria disponible fuera muy escasa. Mediante enlaces más complejos, se podrían registrar pautas de asignación, analizar el uso de la memoria o informar de situaciones específicas.

Enlaces de asignación y asignaciones de memoria en tiempo de ejecución de C
Creación de funciones de enlace de depuración
crt_dbg2 Sample

Mostrar: