Warnung C6242
Ein Sprung aus diesem Try-Block erzwingt lokale Entspannung. und hat schwere Leistungseinbußen zur Folge.
Diese Warnung gibt an, dass eine Sprung-Anweisung dazu führt, dass der Kontrollfluss den geschützten Block eines try-finally
anderen als durch Fall-Through verlässt.
Hinweise
Wenn sie den geschützten Block einer try-finally
anderen als durch einen Rückfall aus der letzten Anweisung verlassen, muss die lokale Entspannung stattfinden. Der lokale Abspann erfordert in der Regel ca. 1000 Maschinenanweisungen, sodass die Leistung beeinträchtigt wird.
Verwenden Sie __leave
, um den geschützten Block einer try-finally-Anweisung zu verlassen.
Codeanalysename: LOCALUNWINDFORCED
Beispiel
Der folgende Code generiert diese Warnung:
#include <malloc.h>
void DoSomething(char *p); // function can throw exception
int f( )
{
char *ptr = 0;
__try
{
ptr = (char*) malloc(10);
if ( !ptr )
{
return 0; //Warning: 6242
}
DoSomething( ptr );
}
__finally
{
free( ptr );
}
return 1;
}
Um die Warnung zu korrigieren, verwenden Sie __leave
, wie im folgenden Code dargestellt:
#include <malloc.h>
void DoSomething(char *p);
int f()
{
char *ptr = 0;
int retVal = 0;
__try
{
ptr = (char *) malloc(10);
if ( !ptr )
{
retVal = 0;
__leave; //No warning
}
DoSomething( ptr );
retVal = 1;
}
__finally
{
free( ptr );
}
return retVal;
}
Die Verwendung von malloc
und free
haben viele Fallstricke in Bezug auf Speicherlecks und Ausnahmen. Um diese Arten von Lecks und Ausnahmeproblemen vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek bereitgestellt werden. Dazu zählen shared_ptr
, unique_ptr
und vector
. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.