Windows内存管理-结构化异常处理(try-finally块)

2024-05-14 17:04

本文主要是介绍Windows内存管理-结构化异常处理(try-finally块),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        结构化异常处理还有另外一种使用方法,就是利用try-finally块,强迫函数在退出前执行一段代码。

NTSTATUS TryFinallyTest()
{NTSTATUS status = STATUS_SUCCESS;__try{// 做一些事情return STATUS_SUCCESS;}__finally{KdPrint(("Enter finally block\n"));}
}


        上面代码块中的__try{}块中,无论运行什么代码(即使是return语句或者触发异常),在程序退出前都会运行__finally{}块中的代码。这样的目的是,在退出前需要运行一些资源回收的工作,而资源回收代码的最佳位置就是放在这个块中。

        除此之外,使用try-finally块还可以某种程度上简化代码。比较下面两段代码,其中第一个是没有使用try-finally块的代码,而第二段代码是使用try-finally。可以看出,第二段代码彼第一段代码简化。

void FooTest()
{NTSTATUS status = STATUS_SUCCESS;// 执行操作1status = Foo1(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){// 回收资源return status;}// 执行操作2status = Foo2(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){// 回收资源return status;}// 执行操作Nstatus = Foo2(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){// 回收资源return status;}// 返回状态,此状态一般是 STATUS_SUCCESSreturn status;
}

以下是使用try-finally 块的代码,实现同样的功能,但可以让代码简化

void FooTest()
{NTSTATUS status = STATUS_SUCCESS;__try{// 执行操作1status = Foo1(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){return status;}// 执行操作2status = Foo2(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){return status;}// 执行操作Nstatus = Foo2(...);    // 判断操作是否成功if(!NT_SUCCESS(status)){return status;}    }__finally{if(!NT_SUCCESS(status)){// 回收资源}        return status;}
}

这篇关于Windows内存管理-结构化异常处理(try-finally块)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989332

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

用Microsoft.Extensions.Hosting 管理WPF项目.

首先引入必要的包: <ItemGroup><PackageReference Include="CommunityToolkit.Mvvm" Version="8.2.2" /><PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" /><PackageReference Include="Serilog

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

问题-windows-VPN不正确关闭导致网页打不开

为什么会发生这类事情呢? 主要原因是关机之前vpn没有关掉导致的。 至于为什么没关掉vpn会导致网页打不开,我猜测是因为vpn建立的链接没被更改。 正确关掉vpn的时候,会把ip链接断掉,如果你不正确关掉,ip链接没有断掉,此时你vpn又是没启动的,没有域名解析,所以就打不开网站。 你可以在打不开网页的时候,把vpn打开,你会发现网络又可以登录了。 方法一 注意:方法一虽然方便,但是可能会有

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

Windows 可变刷新率是什么?如何开启?

在现代计算设备中,显示屏的刷新率对用户体验起着至关重要的作用。随着显示技术的不断进步,固定刷新率显示器逐渐被支持可变刷新率(Variable Refresh Rate, VRR)技术的显示器所取代。 可变刷新率定义 可变刷新率是什么?可变刷新率(VRR)是一种显示技术,它允许显示器的刷新率动态调整,以匹配显卡输出的帧率。传统的显示器通常具有固定的刷新率(如60Hz、75Hz等),这意味着显示器

百度OCR识别结构结构化处理视频

https://edu.csdn.net/course/detail/10506