Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un salto fuera de este bloque try fuerza el desenredado local. lo que produce una grave pérdida de rendimiento
Comentarios
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.
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++.