Поделиться через


C6242

Предупреждение C6242: выход за пределы данного блока try вызывает локальную очистку.При этом значительно снижается производительность.

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

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

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

Пример

Данное предупреждение создается в следующем коде:

#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 имеет много опасностей в терминах утечки памяти и исключений.Чтобы избежать все такие проблемы утечек и исключений, используйте механизмы, предоставляемые библиотекой стандартных шаблонов (STL) C++.Они включают shared_ptr, unique_ptr и vector.Дополнительные сведения см. в разделах Интеллектуальные указатели (современный C++) и Справочник по стандартной библиотеке C++.

См. также

Ссылки

Оператор try-finally