Freigeben über


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.

Siehe auch

try-except-Anweisung
try-finally-Anweisung