您的位置:首页 > 其它

使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数

2015-12-12 19:49 295 查看


使用了非标准扩展:“xxx”使用 SEH,并且“xxx”有析构函数

0条评论

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



上图中黄色部分就是新添加的异常信息,通过stack unwinding来实现局部变量的析构函数自动调用。所以在析构函数中不能抛出异常(http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr155.htm)

具体的异常信息分析见参考url.

/**************/

干货2

/**************/

好,你以为你理解了么,那么看下面的例子:

#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"); 
    } 
}

编辑结果:

1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a2”有析构函数

1>        c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(16) : 参见“a2”的声明

1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(18) : warning C4509: 使用了非标准扩展:“main”使用 SEH,并且“a1”有析构函数

1>        c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(16) : 参见“a1”的声明

1>c:usersjunliang-ayadocumentsvisual studio 2008projectstesttestmain.cpp(22) : error C2712: 无法在要求对象展开的函数中使用 __try

why?

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

参考:
http://baiy.cn/doc/cpp/inside_exception.htm http://blog.pfan.cn/mroske/9865.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: