Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Pendant l’exécution du gestionnaire d’arrêt, vous ne savez peut-être pas quelles ressources ont été acquises avant l’appel du gestionnaire d’arrêt. Il est possible que le __try
bloc d’instructions ait été interrompu avant l’acquisition de toutes les ressources, afin que toutes les ressources n’aient pas été ouvertes.
Pour être sûr, vous devez vérifier quelles ressources sont ouvertes avant de poursuivre le nettoyage de gestion des terminaisons. Voici une procédure recommandée :
Initialiser les handles sur NULL.
Dans le bloc d’instructions
__try
, acquérir des ressources. Les handles sont définis sur des valeurs positives à mesure que la ressource est acquise.Dans le bloc d’instructions, relâchez chaque ressource dont la
__finally
variable de handle ou d’indicateur correspondante n’est pas nulle ou non NULL.
Exemple
Par exemple, le code suivant utilise un gestionnaire d’arrêt pour fermer trois fichiers et libérer un bloc de mémoire. Ces ressources ont été acquises dans le bloc d’instructions __try
. Avant de nettoyer une ressource, le code vérifie d’abord si la ressource a été acquise.
// exceptions_Cleaning_up_Resources.cpp
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#include <windows.h>
void fileOps() {
FILE *fp1 = NULL,
*fp2 = NULL,
*fp3 = NULL;
LPVOID lpvoid = NULL;
errno_t err;
__try {
lpvoid = malloc( BUFSIZ );
err = fopen_s(&fp1, "ADDRESS.DAT", "w+" );
err = fopen_s(&fp2, "NAMES.DAT", "w+" );
err = fopen_s(&fp3, "CARS.DAT", "w+" );
}
__finally {
if ( fp1 )
fclose( fp1 );
if ( fp2 )
fclose( fp2 );
if ( fp3 )
fclose( fp3 );
if ( lpvoid )
free( lpvoid );
}
}
int main() {
fileOps();
}
Voir aussi
Écriture d’un gestionnaire d’arrêts
Structured Exception Handling (C/C++)