C6242
avertissement C6242 : Un saut hors de ce bloc try provoque un déroulement localet entraîne de sérieuses pertes en termes de performances
Cet avertissement indique qu'une instruction de saut provoque la sortie du flux de contrôle du bloc protégé d'un try-finally autrement que par passage.
La sortie du bloc protégé d'un try-finally autrement que par le passage de la dernière instruction requiert un déroulement local.En général, le déroulement local nécessite environ 1000 instructions machine ; par conséquent, il nuit aux performances.
Utilisez _leave pour sortir du bloc protégé d'un try-finally.
Exemple
Le code suivant génère cet avertissement :
#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;
}
Pour corriger cet avertissement, utilisez __leave comme le montre le code suivant :
#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;
}
L'utilisation de malloc et free présente de nombreux pièges en terme de fuites de mémoire et d'exceptions.Pour éviter complètement ce genre de problème de fuites et d'exception, utilisez les mécanismes fournis par la bibliothèque de modèles standard (STL) C++.Ceux-ci incluent shared_ptr, unique_ptr, et vector.Pour plus d’informations, consultez Pointeurs intelligents (Modern C++) et Référence de bibliothèque standard C++.