清理资源

在终止处理程序执行时,不可能知道实际上分配哪些资源,在终止处理程序调用之前。 可能的 __try 语句块中断,在分配之前所有资源,因此,不是打开了所有的资源。

因此,是安全的,应检查哪些资源在继续执行实际上是打开的终止进程的清理之前。 一个建议的过程是:

  1. 初始化处理为 NULL。

  2. 在 __try 语句块,分配资源。 ,在分配,处理设置为正值该资源。

  3. 在 __finally 语句块,释放对应的句柄或标志变量是非零且非空的每个资源。

示例

例如,下面的代码使用一终止处理程序关闭三个文件,并在 __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++)