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++.