Предупреждение 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++".
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по