Enlaces de asignación y asignaciones de memoria en tiempo de ejecución de C

 

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

Una restricción muy importante acerca de las funciones de enlace de asignación consiste en que éstas deben omitir explícitamente los bloques _CRT_BLOCK (las asignaciones de memoria realizadas internamente por las funciones de la biblioteca en tiempo de ejecución de C) si realizan alguna llamada a las funciones de la biblioteca en tiempo de ejecución de C que asigne memoria interna. Los bloques _CRT_BLOCK se pueden omitir si se incluye código como el siguiente al inicio de la función de enlace de asignación:

if ( nBlockUse == _CRT_BLOCK )  
    return( TRUE );  

Si la función de enlace de asignación no omite los bloques _CRT_BLOCK, entonces cualquier función de la biblioteca en tiempo de ejecución de C a la que se llame en el enlace puede hacer que el programa quede atrapado en un bucle sin fin. Por ejemplo, printf realiza una asignación interna. Si el código del enlace llama a printf, la asignación resultante hará que se vuelva a llamar al enlace, que llamará de nuevo a printf , etc. hasta que se desborde la pila. Si necesita informar de las operaciones de asignación de _CRT_BLOCK, una forma de evitar esta restricción consiste en utilizar funciones de la API de Windows, en vez de funciones en tiempo de ejecución de C, para operaciones de formato y salida. Como las API de Windows no utilizan el montón de la biblioteca en tiempo de ejecución de C, no bloquearán el enlace de asignación en un bucle sin fin.

Si examina los archivos de código fuente de la biblioteca en tiempo de ejecución, verá que la función de enlace de asignación predeterminada, CrtDefaultAllocHook (que simplemente devuelve TRUE), se encuentra en un archivo independiente, DBGHOOK.C. Si desea llamar al enlace de asignación incluso en las asignaciones realizadas por el código de inicio en tiempo de ejecución que se ejecuta antes que la función main de la aplicación, puede reemplazar esta función predeterminada por una propia en lugar de usar _CrtSetAllocHook.

Creación de funciones de enlace de depuración
crt_dbg2 Sample

Mostrar: