Condividi tramite


Pulizia delle risorse

Durante l'esecuzione del gestore di terminazione, è possibile che non si conosca quali risorse sono state acquisite prima della chiamata del gestore di terminazione. È possibile che il __try blocco di istruzioni sia stato interrotto prima dell'acquisizione di tutte le risorse, in modo che non tutte le risorse siano state aperte.

Per essere sicuri, è necessario verificare quali risorse sono aperte prima di procedere con la pulizia della gestione della terminazione. Una procedura consigliata consiste in:

  1. Inizializzare gli handle su NULL.

  2. Nel blocco di __try istruzioni acquisire le risorse. Gli handle vengono impostati su valori positivi durante l'acquisizione della risorsa.

  3. Nel blocco di __finally istruzioni rilasciare ogni risorsa la cui variabile handle o flag corrispondente è diversa da zero o non NULL.

Esempio

Ad esempio, il codice seguente usa un gestore di terminazione per chiudere tre file e rilasciare un blocco di memoria. Queste risorse sono state acquisite nel blocco di __try istruzioni. Prima di pulire una risorsa, il codice verifica innanzitutto se la risorsa è stata acquisita.

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

Vedi anche

Scrittura di un gestore di terminazione
Gestione strutturata delle eccezioni (C/C++)