Share via


清理资源

在终止处理程序执行期间,您在调用终止处理程序之前,可能无法知道获取了哪些资源。 __try 语句块可能会在所有资源被获取之前中断,因此并不会打开所有资源。

为安全起见,应检查以查看哪些资源在终止处理清理之前已打开。 建议的过程是:

  1. 将句柄初始化为 NULL。

  2. __try 语句块中,获取资源。 随着资源的获取,句柄将被设置为正值。

  3. __finally 语句块中,释放其对应的句柄或标志变量是非零且非 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();
}

另请参阅

编写终止处理程序
Structured Exception Handling (C/C++)