Condividi tramite


Pulizia delle risorse

Durante l'esecuzione del gestore di terminazione, non è possibile sapere quali risorse in realtà sono allocate prima del gestore di terminazione è stato chiamato.è possibile che __try il blocco di istruzioni è stato arrestato prima di tutte le risorse vengono allocate, in modo che non tutte le risorse sono state aperte.

Di conseguenza, per sicurezza, è necessario verificare quali risorse vengono effettivamente aperte prima di procedere con la pulizia di chiusura-gestione.Una procedura consigliata è:

  1. Inizializzare un handle SU NULL.

  2. in __try il blocco di istruzioni, alloca le risorse.L'handle vengono impostate sui valori positivi mentre la risorsa viene allocata.

  3. in __finally il blocco di istruzioni, rilascia ogni risorsa il cui la variabile corrispondente del flag o handle è diversa da zero né NULL.

Esempio

Ad esempio, il codice seguente utilizza un gestore di terminazione per chiudere tre file e un blocco di memoria allocati in __try blocco di istruzioni.Prima di eliminare una risorsa, i controlli di codice in primo luogo se la risorsa è stata allocata.

// 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();
}

Vedere anche

Riferimenti

Scrittura di un gestore di terminazione

Gestione delle eccezioni strutturata (C++)