Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96299
  • 博文数量: 41
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 486
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-18 20:09
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(1)

2014年(9)

2013年(30)

我的朋友

分类: C/C++

2013-06-15 13:36:38

接上篇的异常的补充,主要是关于异常的开销

/**************/
干货1, 局部对象生命期结束后,怎么实现自动调用析构函数的呢?
/**************/

如果一个函数内使用了异常处理机制, VC 编译器在编译该函数时,它会给此函数插入一些“代码和信息”(代码指的是当该函数中出现异常时的回调函数,而信息主要是指与异常出现相关的一些必要的链表),因此每份函数只能有一份这样的东东(“代码和信息”),故一个函数只能采用一种形式的异常处理规则。




上图中黄色部分就是新添加的异常信息,通过stack unwinding来实现局部变量的析构函数自动调用。所以在析构函数中不能抛出异常()
具体的异常信息分析见参考url.


/**************/
干货2
/**************/
好,你以为你理解了么,那么看下面的例子:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. class A
  3. {
  4. public:
  5.     A() {printf(" 构造一个 A 对象 n");}
  6.     ~A() {printf(" 析构一个 A 对象 n");}
  7.     void f1() {}
  8.     void f2() {}
  9. };

  10. void main()
  11. {
  12.     __try
  13.     {
  14.         A a1, a2;
  15.         puts("in try");
  16.     } __except(puts("in filter 1"), 1)
  17.     {
  18.         puts("in except 1");
  19.     }
  20. }

编辑结果:
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a2”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a2”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a1”有析构函数
1>        c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(16) : 参见“a1”的声明
1>c:\users\junliang-aya\documents\visual studio 2008\projects\test\test\main.cpp(22) : error C2712: 无法在要求对象展开的函数中使用 __try

why?

因为只要有局部对象存在,就一定会存在c++异常处理机制try/catch,而你又调用__try/__except, 一个函数中只能有一种异常处理机制,所以出错。

参考:

http://blog.pfan.cn/mroske/9865.html
阅读(711) | 评论(0) | 转发(0) |
0

上一篇:数据包设计

下一篇:事务-回滚的设计实现

给主人留下些什么吧!~~