Aserciones de CRT

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.

El archivo de encabezado CRTDBG.H define las macros _ASSERT y _ASSERTE para la comprobación de aserciones.

Macro

Resultado

_ASSERT

Si la expresión especificada se evalúa como FALSE, el resultado es el nombre de archivo y el número de línea de la expresión sometida a _ASSERT.

_ASSERTE

Igual que _ASSERT, más una representación de cadena de la expresión sometida a aserción.

_ASSERTE es más eficaz, ya que informa de la expresión sometida a aserción que resultó ser falsa (valor FALSE). Esto puede ser suficiente para identificar el problema sin consultar el código fuente. No obstante, la versión de depuración de la aplicación contiene una constante de tipo cadena para cada expresión sometida a aserción mediante _ASSERTE. Si se utilizan muchas macros _ASSERTE, estas expresiones de cadena ocupan una cantidad de memoria significativa. Si eso constituye un problema, utilice _ASSERT para ahorrar memoria.

Cuando _DEBUG está definida, la macro _ASSERTE se define del siguiente modo:

#define _ASSERTE(expr) \
   do { \
      if (!(expr) && (1 == _CrtDbgReport( \
         _CRT_ASSERT, __FILE__, __LINE__, #expr))) \
         _CrtDbgBreak(); \
   } while (0)

Si la expresión sometida a aserción se evalúa como FALSE, se realiza una llamada a _CrtDbgReport para informar del error de aserción (mediante un cuadro de diálogo de mensaje, de forma predeterminada). Si se elige Reintentar en el cuadro de mensaje, _CrtDbgReport devuelve 1 y _CrtDbgBreak llama al depurador por medio de DebugBreak.

Reemplazar printf

_ASSERTE permite reemplazar el siguiente código:

#ifdef _DEBUG
   if ( someVar > MAX_SOMEVAR )
      printf( "OVERFLOW! In NameOfThisFunc( ),
               someVar=%d, otherVar=%d.\n",
               someVar, otherVar );
#endif

con una única instrucción:

_ASSERTE(someVar <= MAX_SOMEVAR);

Comprobar si el montón está dañado

El siguiente ejemplo usa _CrtCheckMemory para comprobar si el montón ha sufrido algún daño:

_ASSERTE(_CrtCheckMemory());

Comprobar la validez de los punteros

El siguiente ejemplo usa _CrtIsValidPointer para comprobar si un determinado intervalo de memoria es válido para lectura o escritura.

_ASSERTE(_CrtIsValidPointer( address, size, TRUE );

El siguiente ejemplo utiliza _CrtIsValidHeapPointer para verificar si un puntero apunta a la memoria del montón local, que es el montón creado y administrado por esta instancia de la biblioteca en tiempo de ejecución de C (una DLL puede tener su propia instancia de la biblioteca y, por tanto, su propio montón, independiente del montón de la aplicación). Esta aserción captura no sólo direcciones null o fuera de límites, sino también punteros a variables estáticas, variables de pila y cualquier otra memoria no local.

_ASSERTE(_CrtIsValidPointer( myData );

Comprobar un bloque de memoria

El siguiente ejemplo utiliza _CrtIsMemoryBlock para verificar si un bloque de memoria se encuentra en el montón local y tiene un tipo de bloque válido.

_ASSERTE(_CrtIsMemoryBlock (myData, size, &requestNumber, &filename, &linenumber));

Vea también

Conceptos

Aserciones