如果一个函数中有局部对象的存在, 那么它就一定会存在 C++ 的异常处理机制

#include<stdio.h>
class A
{
public:
	A() {printf(" 构造一个 A 对象 \n");}
	~A() {printf(" 析构一个 A 对象 \n");}
	void f1() {}
	void f2() {}
};

void main()
{
	__try
	{
	A a1, a2;
	puts("in try");
	}
	__except(puts("in filter 1"), 1)
	{
	puts("in except 1");
	}
}


/*
--------------------Configuration: exception - Win32 Debug--------------------
Compiling...
seh-test.cpp
f:\exception\seh-test.cpp(214) : warning C4509: nonstandard extension used: 'main' uses SEH and 'a2' has destructor
f:\exception\seh-test.cpp(211) : see declaration of 'a2'
f:\exception\seh-test.cpp(214) : warning C4509: nonstandard extension used: 'main' uses SEH and 'a1' has destructor
f:\exception\seh-test.cpp(211) : see declaration of 'a1'
f:\exception\seh-test.cpp(219) : error C2712: Cannot use __try in functions that require object unwinding
Error executing cl.exe.
Creating browse info file...
exception.exe - 1 error(s), 2 warning(s)
那原因就是: 同样还是由于在一个函数不能采用两种形式的异常处理机制而导致的编译错误。 
啊!这岂不是更迷惑了。其实不然,说穿了,朋友们就会明白了,
这是因为: 在 C++ 异常处理模型中,为了能够在异常发生后,
保证正确地释放相关的局部变量(也即调用析构函数),
它必须要跟踪每一个“对象”的创建过程,
这种由于异常产生而导致的对象析构的过程,
被称为“ unwind ”(记得前面的内容中,也多次讲述到了这个名词),因此,
如果一个函数中有局部对象的存在,
那么它就一定会存在 C++ 的异常处理机制(也即会给此函数插入一些用于 C++ 异常处理“代码和信息”),
这样,如果该函数中在再使用 try-except 机制,
岂不是就冲突了吗?所以编译器也就报错了,
因为它处理不了了! 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值