Advertencia C6242
Un salto fuera de este bloque try fuerza el desenredado 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 un try-finally
de cualquier manera no sea por paso explícito.
Comentarios
Si se sale del bloque protegido de un try-finally
de cualquier manera no sea por paso explícito desde la última instrucción, se requiere un desenredo local. El desenredo local suele necesitar, aproximadamente 1000 instrucciones de código máquina, por lo que afecta negativamente al rendimiento.
Utilice __leave
para salir del bloque protegido de try-finally.
Nombre de análisis de código: LOCALUNWINDFORCED
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 fugas de memoria y excepciones. Para evitar estos problemas, se recomienda usar los mecanismos que proporciona la biblioteca estándar de C++. Estas incluyen shared_ptr
, unique_ptr
y vector
. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.