清理资源
在终止处理程序执行期间,您在调用终止处理程序之前,可能无法知道获取了哪些资源。 __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();
}
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈