다음을 통해 공유


리소스 정리

종료 처리기를 실행하는 동안 종료 처리기가 호출되기 전에 획득한 리소스를 알 수 없습니다. 모든 리소스를 __try 획득하기 전에 문 블록이 중단되어 모든 리소스가 열리지 않을 수 있습니다.

안전하려면 종료 처리 정리를 진행하기 전에 열려 있는 리소스를 확인해야 합니다. 권장 절차는 다음과 같습니다.

  1. 핸들을 NULL로 초기화합니다.

  2. 문 블록에서 __try 리소스를 가져옵니다. 핸들은 리소스를 획득할 때 양수 값으로 설정됩니다.

  3. __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();
}

참고 항목

종료 처리기 작성
구조적 예외 처리(C/C++)