Partager via


Nettoyer des ressources

Pendant l'exécution du gestionnaire de terminaisons, vous ne pouvez pas connaître les ressources qui sont allouées réellement avant que le gestionnaire de terminaisons a été appelé.Il est possible que le bloc d'instructions d' __try ait été interrompu avant que toutes les ressources ont été alloués, afin que toutes les ressources ont été ouvertes.

Par conséquent, pour plus de sécurité, vous devez vérifier les ressources qui sont réellement ouvertes avant de procéder au nettoyage d'arrêt-gestion.une procédure recommandée est :

  1. Initialisez les handles une valeur NULL.

  2. Dans le bloc d'instructions d' __try , allouez des ressources.Les poignées sont définies sur les valeurs positives à mesure que la ressource est allouée.

  3. Dans le bloc d'instructions d' __finally , relâchez chaque ressource dont la variable correspondante de handle ou de balises est différente de zéro ou non NULL.

Exemple

Par exemple, le code suivant utilise un gestionnaire de terminaisons pour fermer trois fichiers et un bloc de mémoire alloués dans le bloc d'instructions d' __try .Avant de nettoyer une ressource, le code vérifie d'abord si la ressource a été allouée.

// 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

Référence

Écrire un gestionnaire de terminaisons

Gestion structurée des exceptions (C++)