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 è:
Inizializzare un handle SU NULL.
in __try il blocco di istruzioni, alloca le risorse.L'handle vengono impostate sui valori positivi mentre la risorsa viene allocata.
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();
}