Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
Inizializzare gli handle su NULL.
Nel blocco di
__tryistruzioni acquisire le risorse. Gli handle vengono impostati su valori positivi durante l'acquisizione della risorsa.Nel blocco di
__finallyistruzioni 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++)