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

Consulte también

Instrucción try-except
Instrucción try-finally