C++可以有两种异常处理方法
1. SEH exceptions (Structured Exception Handling), 结构化异常处理
它有三个关键字__try, __except, __finally,并通过RaiseException 抛出异常
其中一个__try后只能跟一个__except或一个__finally。
当__try后跟__except时,为异常处理(exception handling)
当__try后跟__finally时,为结束处理(termination handling)
它可以捕获内存非法访问,除0等 CPU 引发的硬件异常,以可以捕获通过RaiseException 抛出的软件异常
但它不支持栈回退,但函数中有类变量时无法编译通过
2. C++ exceptions, 有try 和 catch 两个关键字,通过throw 抛出异常
C++ exceptions更为强大,因为它可以抛出并捕获任意类型的异常,并进行栈回退工作,使得RAII技术能得以实现。
-------------------------------------------------------------------------------------------------------
先看看普通函数的栈状态
测试函数
编译器生成的代码 (VS2005, Release)
void simple_func (int x)
{
00401FD0 push ebp <== 保存上一函数的EBP
00401FD1 mov ebp,esp <== 设置EBP 到当前函数栈顶
00401FD3 sub esp,0Ch <== 分配函数局部变量空间
int *p1 = NULL;
00401FD6 mov dword ptr [p1],0
......
}
0040200B mov esp,ebp
0040200D pop ebp
0040200E ret
当前寄存器:
EAX = 003B39A8 EBX = 00000000 ECX = 781C37E4 EDX = 00000000 ESI = 00000001
EDI = 00408590 EIP = 00401FD6 ESP = 0012FF5C EBP = 0012FF68 EFL = 00000216
内存值
0x0012FF50 ...., 4f 1d 13 78
0x0012FF60 c0 ff 12 00, f0 15 40 00, 74 ff 12 00, ca 21 40 00
0x0012FF70 0a 00 00 00, ......
可见一般函数的栈空间很简单:(地址从高到低)
C++异常处理机制__1.SEH处理的函数栈布局
最新推荐文章于 2021-04-12 14:45:09 发布