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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de