在终止处理程序执行期间,您在调用终止处理程序之前,可能无法知道获取了哪些资源。
__try 语句块可能会在所有资源被获取之前中断,因此并不会打开所有资源。
为安全起见,应检查以查看哪些资源在终止处理清理之前已打开。 建议的过程是:
将句柄初始化为 NULL。
在
__try语句块中,获取资源。 随着资源的获取,句柄将被设置为正值。在
__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();
}