Assertions CRT

Cette rubrique s'applique à :

Édition

Visual Basic

C#

F#

C++

Web Developer

Express

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Pro, Premium et Ultimate

La rubrique ne s'applique pas La rubrique ne s'applique pas La rubrique ne s'applique pas

Natif uniquement

La rubrique ne s'applique pas

Le fichier d'en-tête CRTDBG.H définit les macros ASSERT et ASSERTE pour la vérification des assertions.

Macro

Résultat

_ASSERT

Si l'expression spécifiée prend la valeur FALSE, nom de fichier et numéro de ligne de la macro _ASSERT.

_ASSERTE

Identique au résultat de _ASSERT, avec en plus une représentation sous forme de chaîne de l'expression qui a fait l'objet de l'assertion.

La macro _ASSERTE est plus puissante, car elle indique l'expression affirmée dont la valeur est FALSE. Cela peut être suffisant pour identifier le problème dans se reporter au code source. Néanmoins, la version Debug de votre application contiendra une constante de chaîne pour chaque expression affirmée avec _ASSERTE. Si vous utilisez de nombreuses macros _ASSERTE, ces expressions de chaîne occupent une quantité de mémoire considérable. Si cela pose un problème, utilisez _ASSERT pour économiser de la mémoire.

Lorsque _DEBUG est défini, la macro _ASSERTE est définie comme suit :

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

Si l'expression affirmée prend la valeur FALSE, _CrtDbgReport est appelé pour signaler l'échec de l'assertion (à l'aide d'une boîte de dialogue de message par défaut). Si vous choisissez Réessayer dans la boîte de dialogue de message, _CrtDbgReport retourne 1 et _CrtDbgBreak appelle le débogueur par l'intermédiaire de DebugBreak.

Remplacement de printf

_ASSERTE vous permet de remplacer le code suivant :

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

par une seule instruction :

_ASSERTE(someVar <= MAX_SOMEVAR);

Vérification de l'altération du tas

L'exemple suivant utilise _CrtCheckMemory pour vérifier l'altération du tas :

_ASSERTE(_CrtCheckMemory());

Vérification de la validité du pointeur

L'exemple suivant utilise _CrtIsValidPointer pour vérifier qu'une plage mémoire donnée est valide pour lire ou écrire.

_ASSERTE(_CrtIsValidPointer( address, size, TRUE );

L'exemple suivant utilise _CrtIsValidHeapPointer pour vérifier qu'un pointeur désigne la mémoire dans le tas local (le tas créé et managé par cette instance de la bibliothèque Runtime C — une DLL peut avoir sa propre instance de la bibliothèque et donc son propre tas, en dehors de celui de l'application). Cette assertion intercepte non seulement les adresses null ou hors limites, mais également les pointeurs vers des variables static, des variables stack et toute autre mémoire non locale.

_ASSERTE(_CrtIsValidPointer( myData );

Vérification d'un bloc de mémoire

L'exemple suivant utilise _CrtIsMemoryBlock pour vérifier qu'un bloc de mémoire se trouve dans le tas local et que son type est valide.

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

Voir aussi

Concepts

Assertions