Verwenden von VERIFY anstelle ASSERT
Angenommen, beim Ausführen der Debugversion Ihrer MFC-Anwendung sind keine Probleme aufgetreten. Die Releaseversion derselben Anwendung stürzt jedoch ab, gibt falsche Ergebnisse zurück und/oder weist ein anderes anormales Verhalten auf.
Dieses Problem kann verursacht werden, wenn Sie wichtigen Code in einer ASSERT-Anweisung platzieren, um zu überprüfen, ob er ordnungsgemäß ausgeführt wird. Da ASSERT-Anweisungen in einem Releasebuild eines MFC-Programms auskommentiert werden, wird der Code in einem Releasebuild nicht ausgeführt.
Wenn Sie ASSERT verwenden, um zu bestätigen, dass ein Funktionsaufruf erfolgreich war, sollten Sie stattdessen VERIFY verwenden. Das VERIFY-Makro wertet seine eigenen Argumente sowohl in Debug- als auch in Releasebuilds der Anwendung aus.
Eine weitere bevorzugte Methode besteht darin, den Rückgabewert der Funktion einer temporären Variablen zuzuweisen und dann die Variable in einer ASSERT-Anweisung zu testen.
Sehen Sie sich das folgende Codefragment an:
enum {
sizeOfBuffer = 20
};
char *buf;
ASSERT(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Dieser Code wird in einer Debugversion einer MFC-Anwendung problemlos ausgeführt. Wenn der calloc( )
-Aufruf fehlschlägt, wird eine Diagnosemeldung angezeigt, die die Datei und die Zeilennummer enthält. In einem Einzelhandelsbuild einer MFC-Anwendung passiert jedoch Folgendes:
Der
calloc( )
-Aufruf findet nie statt, sodassbuf
nicht initialisiert wird, oderstrcpy_s( )
kopiert "Hello, World
" in einen zufälligen Speicherbereich, was möglicherweise die Anwendung abstürzen lässt oder bewirkt, dass das System nicht mehr reagiert, oderfree()
versucht, Arbeitsspeicher freizugeben, der nie zugeordnet wurde.
Um ASSERT ordnungsgemäß zu verwenden, sollte das Codebeispiel wie folgt geändert werden:
enum {
sizeOfBuffer = 20
};
char *buf;
buf = (char *) calloc(sizeOfBuffer, sizeof(char) );
ASSERT( buf != NULL );
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Oder Sie können stattdessen VERIFY verwenden:
enum {
sizeOfBuffer = 20
};
char *buf;
VERIFY(buf = (char *) calloc(sizeOfBuffer, sizeof(char) ));
strcpy_s( buf, sizeOfBuffer, "Hello, World" );
free( buf );
Siehe auch
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für