一个关于异常处理的问题:

chenlee 2003-01-03 07:15:01
按照C++的定义,类的析构函数应该在类的实例被销毁时自动调用。

但下面一段代码中,异常发生后,test_c的析构函数却没有被调用。

更奇怪的是,如果把“int *a=0; *a=0;”换成一个普通的throw语句,
比如“throw "haha";”则,test_c的析构函数就可以被调用了。

请问,这是编译器的错误呢,还是C++中就是这样规定的?

注:我的编译环境是 WinXP + VC.NET。

请各位大侠指教。

===================

# include <stdio.h>

class test_c
{
public :
test_c()
{
printf("ctor\n");
}
~test_c()
{
printf("dtor\n");
}
};

int main()
{
try
{
test_c test;

// 这一行是为了产生异常
int * a = 0; *a = 1;
}
catch(...)
{
}

getchar();
return 0;
}

===================
...全文
26 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenlee 2003-01-06
  • 打赏
  • 举报
回复
y, that might be all what i can do.
yeahspyme 2003-01-04
  • 打赏
  • 举报
回复
关注。
anrxhzh 2003-01-04
  • 打赏
  • 举报
回复
准确的讲,C++的异常机制只保证对C++异常(通过throw引发)有效,对其他异常是否有效由具体的实现决定。C++异常是软件异常的一种,但是软件异常不仅仅是C++异常,任何软件(包括操作系统)都可能引发软件异常。WIN32的SEH保证可以捕获所有的软件异常和硬件异常,但是SEH不支持编程语言特有的机制,比如C++的stack unwind。Microsoft的文档对VC6.0的C++实现是否支持C++异常以外的异常语焉不详,所以你碰到这样的问题也不要奇怪。你如果一定要求硬件异常安全,可以用SEH来模拟一个stack unwind,这比较烦,算是最后一招吧。
chenlee 2003-01-04
  • 打赏
  • 举报
回复
to : anrxhzh(百宝箱)

you mean there is no way to guarantee that the local variable's
destructor would be called when hardware exception occurs?
anrxhzh 2003-01-03
  • 打赏
  • 举报
回复
换句话说,catch(...)能不能捕获硬件异常,是有具体的实现决定的。你必须在具体的平台下作测试,根据我的经验,WINDOWS和UNIX平台的某些C++编译器是能捕获硬件异常的,VC6.0就是其中之一。不幸的是,经验并不总是可靠的,比如你给出的例子。不过你的例子稍作修改就可以如你期望地那样工作,我相信你能够找到修改的地方,不过不要问我为什么要这样修改,我也不保证我的修正版总是能够正常的工作。

void foo(){}

# include <stdio.h>

class test_c
{
public :
test_c()
{
printf("ctor\n");
}
~test_c()
{
printf("dtor\n");
}
};

int main()
{
try
{
test_c test;

foo();//my code

// 这一行是为了产生异常
int * a = 0; *a = 1;
}
catch(...)
{
}

getchar();
return 0;
}


anrxhzh 2003-01-03
  • 打赏
  • 举报
回复
Exceptions are designed for error handling. There are two kinds of exceptions - hardware or software. The hardware exception occurs when you do a divide by zero, access invalid pointers, and so on. Dealing with hardware exceptions is usually platform dependant, and the C++ standard has no rules on how hardware exceptions are to be dealt with.
solotony 2003-01-03
  • 打赏
  • 举报
回复
你可以在catch中打一行log,看看为什么不调用析构函数
HaiFen 2003-01-03
  • 打赏
  • 举报
回复
C++标准保证,throw异常时,堆栈解退会将局部对象析构,但没保证硬件异常时也会析构局部对象
phiger 2003-01-03
  • 打赏
  • 举报
回复
int * a = 0; *a = 1; this is structure exception,and the throw exception is C++ exception!!
liu_feng_fly 2003-01-03
  • 打赏
  • 举报
回复
不知道,关注
rushman 2003-01-03
  • 打赏
  • 举报
回复
这恐怕是异常有谁来触发的问题。
程序中的异常是由操作系统触发的,可能是因为这样,避开了C++语言的异常处理机制。
如果要捕捉系统的异常用:
__try{
.....
}
__except(EXCEPT_CONTINUE_EXECUTE)//或者是EXCEPTION_EXECUTE_HANDLER
//EXCEPT_CONTINUE_SEARCH等
{
}
//还有这个__finally{......}
HaiFen 2003-01-03
  • 打赏
  • 举报
回复
在C++中,异常仅仅指由throw抛出的,硬件异常不算

64,637

社区成员

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

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