C6242
Ostrzeżenie C6242: wyjście z tego bloku try wymusza lokalną operację unwind.Powoduje poważny spadek wydajności
Ostrzeżenie to wskazuje, że instrukcja jump powoduje, że przepływ sterowania opuszcza chroniony blok try-finally inaczej niż przez przejście.
Opuszczenie chronionego bloku try-finally inaczej niż przez przejście przez ostatnią instrukcję, wymaga wystąpienia lokalnej operacji unwind.Lokalna operacja unwind wymaga zazwyczaj około 1000 instrukcji maszynowych; z tego powodu, jest ona szkodliwa dla wydajności.
Użyj _leave, aby wyjść z chronionego bloku try-finally.
Przykład
Poniższy kod generuje to ostrzeżenie:
#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;
}
Aby poprawić to ostrzeżenie, użyj __leave, tak jak pokazano w poniższym kodzie:
#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;
}