종료 처리기를 실행하는 동안 종료 처리기가 호출되기 전에 획득한 리소스를 알 수 없습니다. 모든 리소스를 __try 획득하기 전에 문 블록이 중단되어 모든 리소스가 열리지 않을 수 있습니다.
안전하려면 종료 처리 정리를 진행하기 전에 열려 있는 리소스를 확인해야 합니다. 권장 절차는 다음과 같습니다.
핸들을 NULL로 초기화합니다.
문 블록에서
__try리소스를 가져옵니다. 핸들은 리소스를 획득할 때 양수 값으로 설정됩니다.__finally문 블록에서 해당 핸들 또는 플래그 변수가 0이 아니거나 NULL이 아닌 각 리소스를 해제합니다.
예시
예를 들어 다음 코드는 종료 처리기를 사용하여 세 개의 파일을 닫고 메모리 블록을 해제합니다. 이러한 리소스는 문 블록에서 __try 획득되었습니다. 리소스를 정리하기 전에 코드는 먼저 리소스를 획득했는지 확인합니다.
// 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();
}