Compartir a través de


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

Actualización: noviembre 2007

Este tema es aplicable a:

Edición

Visual Basic

C#

C++

Web Developer

Express

Sólo para código nativo

Standard

Sólo para código nativo

Pro y Team

Sólo para código nativo

Leyenda de la tabla:

Se aplica

No procede

Comando o comandos ocultos de manera predeterminada.

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 devuelve simplemente TRUE), se encuentra en un archivo independiente, DBGHOOK.C. Si desea llamar al enlace de asignación incluso para 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 utilizar _CrtSetAllocHook.

Vea también

Tareas

Ejemplo crt_dbg2: funciones de enlace de depuración de las bibliotecas en tiempo de ejecución de C

Otros recursos

Creación de funciones de enlace de depuración