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;
}
El uso de las opciones malloc y free tiene muchos riesgos en cuanto a pérdidas de memoria y excepciones.Para evitar todos estos tipos de problemas de pérdidas de memoria y excepciones, use los mecanismos proporcionados por la Biblioteca de plantillas estándar (STL) de C++.Estos incluyen shared_ptr, unique_ptr y vector.Para obtener más información, vea Punteros inteligentes (C++ moderno) y Referencia de biblioteca estándar de C++.