C6242
advertencia C6242: Un salto fuera de este bloque try fuerza el desenredo local,lo que produce una grave pérdida de rendimiento
Esta advertencia indica que una instrucción de salto hace que el flujo de control salga del bloque protegido de try-finally de otra manera que por paso explícito.
Cuando se sale del bloque protegido de try-finally de otra manera que pasando explícitamente desde la última instrucción, se requiere un desenredo local.Para el desenredo local se suelen necesitar, aproximadamente, 1000 instrucciones de código máquina; por consiguiente, afecta negativamente al rendimiento.
Utilice _leave para salir del bloque protegido de try-finally.
Ejemplo
El código siguiente genera esta advertencia:
#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 corregir esta advertencia, use __leave como se muestra en el código siguiente:
#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;
}