使用了非标准扩展:“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
相关文章推荐
- 篮桥杯入门训练 圆的面积
- 农行网银软件导致XP死机
- Lua语言教程0 ——编译环境搭建
- [javase学习笔记]-3.2 switch语句
- 【NuGet】远程服务器返回错误:<403>已禁止
- 链表的基本功能实现
- jwt(json-web-token)在rest中的实现--jersey
- linux内存泄漏检测
- APUE:实际用户ID和有效用户ID(euid)
- 推荐几篇学习rest风格的文章
- Mantle源代码阅读笔记 一
- (Fun)*((int*)*(int*)(&b)); http://bbs.csdn.net/topics/320008423
- 20151212jquery学习笔记--工具函数
- codeforces 418 C Square Table (随机算法)
- SAX解析XML文件
- VS2013下 开发简单的MFC小程序
- linux C 学习---函数指针
- JavaScript、CSS、HTML 实现用户注册页面与信息校验
- Tomcat 源码分析(转)
- 配置Caffe+VS2013+CUDA 6.5+Windows 8.1 64位系统