Предупреждение C6242

Выпрыгнуть из этого пробного блока заставляет локальную очистку. Вызывает серьезные штрафы за производительность

Это предупреждение указывает, что оператор перехода приводит к тому, что поток управления покидает защищенный блок try-finally , отличный от падения.

Замечания

Выход из защищенного блока, отличного от падения из последней инструкции, требует локальной try-finally очистки. Для локальной очистки обычно требуется около 1000 машинных инструкций, поэтому это вредно для производительности.

Используйте __leave для выхода из защищенного блока try-finally.

Имя анализа кода: LOCALUNWINDFORCED

Пример

Следующий код создает это предупреждение:

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

Чтобы исправить это предупреждение, используйте __leave , как показано в следующем коде:

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

Использование malloc и free множество ошибок в плане утечки памяти и исключений. Чтобы избежать таких утечек и проблем исключений, используйте механизмы, предоставляемые стандартной библиотекой C++. Это операторы shared_ptr, unique_ptr, а также vector. Дополнительные сведения см. в разделе "Смарт-указатели " и "Стандартная библиотека C++".

См. также

Инструкция try-except
Инструкция try-finally