免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 7534 | 回复: 2
打印 上一主题 下一主题

[C++] 这个dynamic_cast不能抛出异常,而是崩溃了!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-01 14:27 |显示全部楼层 |倒序浏览
10可用积分
如题,我写了下面这个程序,测试dynamic_cast错误处理的情况
#include <stdio.h>
#include <stdlib.h>
#include <typeinfo>
using namespace std;
class A{
public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int x;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;virtual void fa(){}
};
class B{
public:
&nbsp;&nbsp;&nbsp;&nbsp;int y;
&nbsp;&nbsp;&nbsp;&nbsp;//virtual void foo(){}

};
class D:public B{
public:
&nbsp;&nbsp;&nbsp;&nbsp;int z;
};
int main(int argc, char *argv[]){
&nbsp;&nbsp;&nbsp;&nbsp;B* pb=new B();
&nbsp;&nbsp;&nbsp;&nbsp;B& rb=*pb;
&nbsp;&nbsp;&nbsp;&nbsp;try{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//D& rd =dynamic_cast<D&>(rb);//本语句会抛出std::bad_cast

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A* pa=(A*)pb;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;D* pd=dynamic_cast<D*>(pa);
&nbsp;&nbsp;&nbsp;&nbsp;}catch(std::bad_cast){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("std::bad_cast\n");
&nbsp;&nbsp;&nbsp;&nbsp;}catch(...){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("get other exception\n");
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//system("PAUSE");

&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}


我期望pa被dynamic_cast转型的时候,能抛出某种异常,但是实际上程序崩溃了。
=====================================================
我的环境是winxp+devcpp4992,是gcc/gdb的集成环

>gcc --version
gcc (GCC) 3.4.2 (mingw-special)
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

请dx帮忙解释一下,10分感谢!

[ 本帖最后由 jeanlove 于 2009-2-1 14:28 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-02-01 14:43 |显示全部楼层
原帖由 wwwsq 于 2009-2-1 14:32 发表
GCC编译选项

/GX[-] 启用 C++ 异常处理(与 /EHsc 相同) enable C++ EH (same as /EHsc)
/EHs 启用同步 C++ 异常处理 enable synchronous C++ EH
/EHa 启用异步 C++ 异常处理 enable asynchronous C++ E ...

谢谢,但是有点不明白的地方,就是我之前
D& rd =dynamic_cast<D&>(rb);
这句话是可以成功抛出异常的,这是不是说明异常处理的功能已经启用了呢????

论坛徽章:
0
3 [报告]
发表于 2009-02-01 15:33 |显示全部楼层
原帖由 emacsnw 于 2009-2-1 15:20 发表


我觉得崩溃时因为你前面的那个c-style cast使得RTTI寻找对象的类层次时候访问内存越界导致的。

我把B加上了那个virtual的关键字,似乎就不会崩溃了。感觉这个解释最贴切,还是要给分的!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP