Oczyszczanie zasobów
Podczas wykonywania programu obsługi zakończenia możesz nie wiedzieć, które zasoby były faktycznie przydzielone przed jego wywołaniem.Istnieje możliwość, że blok instrukcji __try został przerwany zanim przydzielone zostały wszystkie zasoby, zatem nie wszystkie zasoby zostały otwarte.
Z tego powodu, przed przystąpieniem do oczyszczania za pomocą programu obsługi zakończenia, dla bezpieczeństwa należy sprawdzać, które zasoby są faktycznie otwarte.Zalecana procedura to:
Zainicjować dojścia wartością null.
W bloku instrukcji __try przydzielić zasoby.Dojścia są ustawione na wartości dodatnie, gdy zasób jest przydzielony.
W bloku instrukcji __finally zwolnić każdy zasób, którego odpowiadające dojście lub zmienna flagowa jest niezerowe ani nie ma wartości null.
Przykład
Na przykład, następujący kod używa programu obsługi zakończenia, aby zamknąć trzy pliki oraz blok pamięci przydzielone w bloku instrukcji __try.Przed czyszczeniem zasobu kod sprawdza najpierw czy zasób został przydzielony.
// 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();
}