c++抛异常导致程序core

Leejun527 2010-07-20 11:08:26
下面的代码,在vs2005上运行正常,但在linux下和solaris均会导致程序崩溃;
请大家帮忙分析下原因。多谢!

#include <iostream>
using namespace std;

class UserException
{
public:

/// Copy constructor.
UserException ()
{}
/// Destructor.
virtual ~UserException (void){}

};

class UserException2
{
public:

/// Copy constructor.
UserException2 ()
{}
virtual void func(){}
/// Destructor.
virtual ~UserException2 (void){}

};

class test
{
public:
void call ()throw(UserException2)
{
cout << "call" << endl;
//抛出的异常类型和函数声明的异常类型不同。程序在这里崩溃
throw UserException();
//如果抛出下面这个异常,自然是没问题的。
//throw UserException2();

}

};


int main(int argc, char *argv[])
{
UserException bs;

test mm;
try
{
mm.call();
}
catch(UserException & ex)
{
cout << "UserException1" << endl ;
}
catch(UserException2 & ex)
{
cout << "UserException2" << endl ;
}
catch (...)
{
}
cout << "oo" << endl ;

return 0;
}


...全文
456 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ayw215 2010-07-20
  • 打赏
  • 举报
回复
不懂帮顶
cnlm2 2010-07-20
  • 打赏
  • 举报
回复
http://blog.csdn.net/vagrxie/archive/2007/10/11/1819382.aspx

这个问题专家的博客上有讨论!!!
pengzhixi 2010-07-20
  • 打赏
  • 举报
回复
既然你声明抛出UserException2那么就按规矩来。否则会直接结束程序
cnlm2 2010-07-20
  • 打赏
  • 举报
回复
vs编译这个程序是会报警告的
warning C4290: 忽略C++ 异常规范,但指示函数不是__declspec(nothrow)

警告消息
忽略 C++ 异常规范,但指示函数不是 __declspec(nothrow)

使用异常规范声明函数,Visual C++ 接受但并不实现此规范。包含在编译期间被忽略的异常规范的代码可能需要重新编译和链接,以便在支持异常规范的未来版本中重用。

有关更多信息,请参见 Exception Specifications。

也就是vs并没有实现你程序中 void call ()throw(UserException2) 申明的功能,所以不会报错,也可以捕捉到 throw UserException();

在linux上gcc实现了function() throw()这个功能!!



ztenv 版主 2010-07-20
  • 打赏
  • 举报
回复
使用g++再编译一次,编译的时候加上-g参数,然后使用gdb调试生成的程序并指定你的源码路径:gdb 运行程序 -d 源码路径
或在程序生成core的时候,加载core:gdb 运行程序 -c core名字
SLSnake 2010-07-20
  • 打赏
  • 举报
回复
http://hi.baidu.com/fantacy129/blog/item/7ae5f58807f97c98a5c27210.html
楼主看下这篇文章吧,应该对你有帮助,里面的程序g++编译的
感觉楼主在void call ()throw(UserException2)
这个地方没写好,导致异常类型不同
赵4老师 2010-07-20
  • 打赏
  • 举报
回复
进程意外退出会在当前目录下产生形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈
ZongShengLee 2010-07-20
  • 打赏
  • 举报
回复
打车同问
taodm 2010-07-20
  • 打赏
  • 举报
回复
去google "C与C++中的异常处理"
异常规格声明不是这么瞎折腾的。
taodm 2010-07-20
  • 打赏
  • 举报
回复
那些最基本的规范,必须每个人都清楚的。
不清楚就敢用的人则是瞎折腾。
Leejun527 2010-07-20
  • 打赏
  • 举报
回复
感谢大家的热心帮助,确实是异常声明的规范问题。受教了!

ps:小弟并非无事来这瞎折腾,确实是在一个项目的维护中发现的问题,毕竟不是每个人都清楚c++的每个规范。
Rainqin123 2010-07-20
  • 打赏
  • 举报
回复
BOOST问题,
Rainqin123 2010-07-20
  • 打赏
  • 举报
回复
看看这点解释,可能有用,问题的解救在这了!
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
namespaceboost {#ifdef BOOST_NO_EXCEPTIONS void throw_exception( std::exception const & e ); // user defined#else template <class E> void throw_exception( E const & e );#endif
}要求:E 必须从继承自 std::exception.

效果:如果 BOOST_NO_EXCEPTIONS 没有定义, 函数boost::throw_exception(e) 等价于 throw boost::enable_current_exception(boost::enable_error_info(e)), 除非 BOOST_EXCEPTION_DISABLE 被定义了, 在那种情况下 boost::throw_exception(e) 等价于 throw e;
如果 BOOST_NO_EXCEPTIONS 被定义了, 那么这个函数没有被定义, 用户应该定义一个合适的实现. 函数throw_exception 的调用者可以合理的假定这个函数永不返回; 如果用户定义的函数返回了, 函数throw_exception 的行为时未定义的 .

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧