Udostępnij za pośrednictwem


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;
}

Zobacz też

Informacje

Instrukcja try-finally