c++与异常
vc++扩展了异常回调函数得语法,增加了两个新的参数: 【程序编程相关:过滤钩子驱动程序(2)】 再回头来说我们在第一节里说到的 exception_registration结构,这个结构是用来注册操作系统的异常回调函数的,当异常发生时,该函数将被调用. 【推荐阅读:MFC技术内幕系列之(二)---MFC文】{ 【扩展信息:再说我们的CPU】struct exception_registration
exception_registration *prev; dword handler; int id; dword ebp;}; vc ++里,除了一些例外,在每个函数的头部生成exception_registration结构的局部变量(作者注:编译器可能在一个函数里根本不生成任何异常相关的代码,如果函数里没有try或者所有的局部对象都没有可供调用的析构函数(译注:当异常产生时,要把堆栈顶到catch到异常那点之间的局部变量都释放掉,这是异常处理一个重要责任.如果这些局部变量都不需要去特别释放,比如int变量或简单结构变量,只要把堆栈指针指过来就可以了,异常处理在这一段里就是没有必要的,因此编译器识别了这样的情况,作个一定的优化)).上面结构的ebp与前面说的堆栈帧里的ebp指针是重叠在一起的(译注:请参看c++编译器怎么实现异常处理2),函数在开始时把这个结构创建在它的堆栈上,同时把这个结构注册到操作系统(译注:就是把fs:[0]的位置改成这个结构的指针);在函数的结尾恢复调用者在系统注册的exception_registration结构(译注:就是把fs:[0]改成结构里的prev),我将在下一节讨论exception_registration结构里的id域的重要性. 当vc++编译一个函数,它生成函数的两套数据: a) 异常的回调函数 b) 一个包含重要信息的数据结构,这些重要信息比如,各个catch块,它们的地址,关心的异常的种类等等,我将在下一节更多的谈论它 图 4 显示了如果考虑异常处理,程序运行时堆栈的情况.... 下一页