リソースをクリーンアップできます。

終了ハンドラーの実行時に終了ハンドラーが呼び出される前にリソースが実際に割り当てられているかわからない場合があります。すべてのリソースが開かなかったようにすべてのリソースが終了する前に __try のステートメント ブロックがして可能性があります。

したがってリソースが実際に終了処理の後に進む前に開かれているか安全のためにチェックする必要があります。推奨される手順はです :

  1. 無効にする初期化のハンドル。

  2. __try のステートメント ブロックではリソースを割り当てます。ハンドルが正の値にリソースを割り当てるため設定されます。

  3. __finally のステートメント ブロックで対応するハンドルやフラグの変数がゼロまたは null 以外である各リソースを解放します。

使用例

たとえば__try のステートメント ブロックで割り当てられたメモリ ブロックは次のコードは3 種類のファイルを閉じるに終了ハンドラーを使用します。リソースをクリーンアップする前にリソースが割り当てられているかどうか最初に調べます。

// 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++)