关于C++异常问题

snowingboy 2009-04-09 12:27:26
"异常对象并非创建在函数堆栈上,而是创建在专用的异常堆栈上,因此它才可以跨接多个函数传递到上层,否则在堆栈清退时,就会初销毁。"

上面这一段是来到自一本C++书籍。

可是小弟对上面这句话有些怀疑。

如下代码:

#include <iostream>

using std::cout;
using std::endl;


class A
{
public:
A ()
{
cout << "构造函数 A" << endl;
}

~ A ()
{
cout << "析构函数 A" << endl;
}

A (const A &)
{
cout << "复制构造函数 A" << endl;
}
};

class B
{
public:
B ()
{
cout << "构造函数 B" << endl;
}

~ B ()
{
cout << "析构函数 B" << endl;
}
};

void fun () throw ( A )
{
B b;

throw A(); // (1)
//throw &A(); // (2),传指针
}
int main ()
{
try
{
fun ();
}
catch ( A &) // (3)
//catch ( A *) // (4)
{
cout << "Exception A" << endl;
}

return 0;
}

以上代码在VC中通过,强果如下:
组合一((1)与(3)):

构造函数 B
构造函数 A
析构函数 B
Exception A
析构函数 A

如此看来,A(应该)构造在"专用的堆栈"上,请看组合二结果。

组合二((2)与(4)):

构造函数 B
构造函数 A
析构函数 A
析构函数 B
Exception A

如此来看,当用指针传递异时,A在B销毁之前被销毁,
如此看来,它不是在“专用的堆栈”中。

小弟一时不解啊,学习当中,望好心人帮忙。
Thank you very much!

“专用的堆栈”真的存在吗?
...全文
74 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2009-04-09
  • 打赏
  • 举报
回复
不存在。异常只是编译器处理,没有语法规定。
所以,不同编译器,实现原理并不相同。

65,210

社区成员

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

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