Czyszczenie zasobów
Podczas wykonywania procedury obsługi sytuacji krańcowych może nie wiedzieć, które zasoby są przydzielane faktycznie, zanim została wywołana procedura obsługi sytuacji krańcowych.Istnieje możliwość, że __try instrukcji bloku została przerwana przed wszystkie zasoby zostały przydzielone, tak że nie wszystkie zasoby zostały otwarte.
W związku z tym aby być pewnym, należy sprawdzić wyświetlić zasoby, które są faktycznie otwarte przed kontynuowaniem Oczyszczanie termination handling.Procedury zalecane jest:
Zainicjować dojścia do wartości NULL.
W __try instrukcji bloku, przydzielić zasobów.Uchwyty są ustawione na wartości dodatnie, zasób jest przydzielony.
W __finally instrukcji bloku dopuszczenia każdego zasobu, którego odpowiedni uchwyt lub zmiennej flagi jest różna od zera lub not NULL.
Przykład
Na przykład, następujący kod używa procedury obsługi sytuacji krańcowych zamknąć trzy pliki i blok pamięci, które zostały przydzielone w __try instrukcji bloku.Przed czyszczenie zasobu, kod najpierw sprawdza Zobacz jeśli przydzielono zasób.
// 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();
}