Freigeben über


CRT-Assertionen

Aktualisiert: November 2007

Dieses Thema gilt für folgende Anwendungsbereiche:

Edition

Visual Basic

C#

C++

Web Developer

Express

Nur "Systemeigen"

Standard

Nur "Systemeigen"

Pro und Team

Nur "Systemeigen"

Tabellenlegende:

Vorhanden

Nicht vorhanden

Befehl oder Befehle, die standardmäßig ausgeblendet sind.

Die Headerdatei Crtdbg.h enthält Definitionen der Makros "_ASSERT" und "_ASSERTE", die zur Überprüfung von Assertionen verwendet werden.

Makro

Ergebnis

_ASSERT

Dateiname und Zeilennummer von _ASSERT, wenn der angegebene Ausdruck mit FALSE ausgewertet wird.

_ASSERTE

Identisch mit _ASSERT, zusätzlich jedoch eine Zeichenfolgenentsprechung des Ausdrucks, für den die Assertion ausgeführt wurde.

_ASSERTE ist leistungsfähiger, da der überwachte Ausdruck gemeldet wird, wenn er mit FALSE ausgewertet wurde. Auf diese Weise lässt sich das Problem u. U. bereits ohne Zuhilfenahme des Quellcodes identifizieren. In der Debugversion der Anwendung ist jedoch für jeden mit _ASSERTE überprüften Ausdruck eine Zeichenfolgenkonstante enthalten. Bei Verwendung vieler _ASSERTE-Makros können diese Zeichenfolgenausdrücke beträchtlichen Speicherplatz belegen. Falls dies zu Problemen führt, verwenden Sie _ASSERT, um Speicherplatz zu sparen.

Wenn _DEBUG definiert ist, sieht die Definition des _ASSERTE-Makros wie folgt aus:

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

Wenn der Ausdruck bei der Assertionsauswertung FALSE ergibt, wird _CrtDbgReport aufgerufen und gibt den Assertionsfehler (standardmäßig in einem Meldungsdialogfeld) aus. Wenn Sie im Meldungsdialogfeld Wiederholen auswählen, gibt _CrtDbgReport den Wert 1 zurück, und _CrtDbgBreak ruft den Debugger über DebugBreak auf.

Ersetzen von "printf"

_ASSERTE ermöglicht es Ihnen, den Code

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

durch eine einzige Anweisung zu ersetzen:

_ASSERTE(someVar <= MAX_SOMEVAR);

Überprüfen des Heaps auf Beschädigungen

Im folgenden Beispiel wird _CrtCheckMemory verwendet, um den Heap auf Beschädigungen zu überprüfen:

_ASSERTE(_CrtCheckMemory());

Überprüfen der Gültigkeit von Zeigern

Im folgenden Beispiel wird anhand von _CrtIsValidPointer überprüft, ob in einen bestimmten Speicherbereich geschrieben bzw. daraus gelesen werden kann.

_ASSERTE(_CrtIsValidPointer( address, size, TRUE );

Im folgenden Beispiel wird anhand von _CrtIsValidHeapPointer überprüft, ob ein Zeiger auf Speicher im lokalen Heap zeigt. (Es handelt sich um den Heap, der von dieser Instanz der C-Laufzeitbibliothek generiert und verwaltet wird. Eine DLL kann über eine eigene Bibliotheksinstanz und daher auch über einen eigenen Heap außerhalb des Anwendungsheaps verfügen). Diese Assertion erkennt nicht nur NULL-Adressen oder Adressen außerhalb des gültigen Bereichs, sondern auch Zeiger auf statische Variablen, Stapelvariablen und sonstigen nicht lokalen Speicher.

_ASSERTE(_CrtIsValidPointer( myData );

Überprüfen eines Speicherblocks

Im folgenden Beispiel wird anhand von _CrtIsMemoryBlock sichergestellt, dass ein Speicherblock sich im lokalen Heap befindet und über einen gültigen Blocktyp verfügt.

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

Siehe auch

Konzepte

Assertionen