Compartilhar via


Aviso C6242

Um salto desse bloco de tentativa força o desenrolar local. Isso resulta em uma perda severa de desempenho

Esse aviso indica que uma instrução de salto faz com que o fluxo de controle saia do bloco protegido de um try-finally de outro modo que não por fall-through.

Comentários

Sair do bloco protegido de um try-finally de outro modo que não por fall-through da última instrução exige que ocorra um desenrolar local. O desenrolar local normalmente requer aproximadamente 1.000 instruções de computador, o que o torna prejudicial ao desempenho.

Use __leave para sair do bloco protegido de um try-finally.

Nome da análise de código: LOCALUNWINDFORCED

Exemplo

O seguinte código gera esse aviso:

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

Para corrigir esse aviso, use __leave conforme mostrado no seguinte código:

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

O uso de malloc e free tem muitas armadilhas em termos de vazamentos de memória e exceções. Para evitar por completo esses tipos de problema envolvendo vazamentos e exceções, use os mecanismos fornecidos pela Biblioteca Padrão do C++. Elas incluem shared_ptr, unique_ptr e vector. Para obter mais informações, confira Ponteiros inteligentes e Biblioteca Padrão do C++.

Confira também

try-exceptinstrução
try-finallyinstrução