try、catch调用过程中构造、析构函数问题,请指教。

leebuilder 2006-06-14 06:13:18
#include <exception>
#include <iostream.h>
#include <stdlib.h>

class Up
{
public:
Up() {cout<<"Up con"<<endl;}
~Up() {cout<<"~Up don"<<endl;}
};
class fit
{
public:
fit() {cout<<"fit con"<<endl;}
~fit() {cout<<"~fit don"<<endl;}
};

void g();
void f(int iExcept) throw(Up, fit);
void My_Unexcepted();

void main()
{
//set_unexpected(My_Unexcepted);
for(int iL = 1; iL <= 3; iL++)
{
try
{
f(iL);
}
catch(Up)
{
cout<<"Up caught"<<endl;
}
catch(fit)
{
cout<<"fit caught"<<endl;
}
catch(...)
{
cout<<"Unknown exception"<<endl;
}
}
}

void f(int iExcept)
{
switch(iExcept)
{
case 1:throw Up();
case 2:throw fit();
}

g(); //use unknown exception
}
void g()
{
//longjmp(Koera, 1);
throw 30;
}

void My_Unexcepted()
{
cout<<"unexcepted exception thrown"<<endl;
exit(1);
}
执行结果为什么构造函数调用一次,而析构函数调用两次,这是怎么回事?
结果:
Up con
~Up don
Up caught
~Up don
fit con
~fit don
fit caught
~fit don
Unknown exception
...全文
280 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayafu 2006-06-16
  • 打赏
  • 举报
回复
我告诉你是为什么,构造函数是在f中调用一次,这没问题,而你在catch中用的是对象,不是引用或指针,所以catch部分又产生了新的对象,但这个对象是用拷贝构造函数复制的f中的对象,所以没调用你的构造函数,但在退出时f产生的对象和catch中的参数都要析构,所以是两次析构函数的调用。OK,明白吗,好好学c++吧。
leebuilder 2006-06-16
  • 打赏
  • 举报
回复
怎么没人回啊,哪位大哥级人物帮帮忙啊?
leebuilder 2006-06-14
  • 打赏
  • 举报
回复
能说说为什么嘛?我按照你说的改成虚函数,但结果是这样:
Up con
Up caught
Up::Exceptioned
~Up don
~Up don
这不还是调用两次析构函数么?
请说说这是为什么?谢谢
折腾_苏州 2006-06-14
  • 打赏
  • 举报
回复
析构函数定义成虚函数:virtual
leebuilder 2006-06-14
  • 打赏
  • 举报
回复
在线等,解决就给分

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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