牛牛们帮忙看看

operatingtuzi 2010-11-10 07:04:34

class A1
{
public:
A1()
{
cout<<"A1\n";

cout<<"A1 end\n";
}
~A1()
{
cout<<"~A1\n";
}
};
class A2
{public:
A2()
{
cout<<"A2\n";
throw(1); //故意的
cout<<"A2 end\n";
}
};
class A
{
public:
A():pA1(new A1),pA2(new A2) //请看这里
{cout<<"a\n";}
~A(){cout<<"~a\n";}
private:
const auto_ptr<A1> pA1;
const auto_ptr<A2> pA2;
};

在Scott Meyers的书中说,如果调用构造函数时,pA2发生了异常,会自动调用A1的析构函数释放资源
但是这里并没有调用任何析构函数
为什么呢
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
别逗我乐 2010-11-11
  • 打赏
  • 举报
回复

#include <iostream>
#include <memory>
using namespace std;
class A1
{
public:
A1()
{
cout<<"A1\n";
cout<<"A1 end\n";
}
~A1()
{
cout<<"~A1\n";
}
};
class A2
{
public:
A2()
{
cout<<"A2\n";
throw(1); //故意的
cout<<"A2 end\n";
}
};
class A
{
public:
A():pA1(new A1),pA2(new A2) //请看这里
{
cout<<"a\n";
}
~A()
{
cout<<"~a\n";
}
private:
const auto_ptr<A1> pA1;
const auto_ptr<A2> pA2;
};
int main()
{
try
{
A a1;
}
catch(...)
{
cout<<"异常了"<<endl;
}
cout<<"Hello world"<<endl;
return 0;
}

结果:
A1
A1 end
A2
~A1
异常了
Hello world

Process returned 0 (0x0) execution time : 0.109 s
Press any key to continue.
别逗我乐 2010-11-11
  • 打赏
  • 举报
回复
楼上的正解!!
gules 2010-11-11
  • 打赏
  • 举报
回复
pA1的析构函数是肯定调用了,进而A1的析构函数也就被调用了。

因为你没有在主函数中捕获异常,程序异常退出,所以在栈回退时析构的打印是在main之后(你看不到而矣!);只要你在主程序中捕获异常,就可以看到输出了。
hai040 2010-11-11
  • 打赏
  • 举报
回复
按道理是会析构的
main函数是什么
赵4老师 2010-11-11
  • 打赏
  • 举报
回复
记不得哪位C++大牛在哪本学习C++的书的前言里面说过
“用C语言1000行源码能完成的工作千万不要用C++重写!”
operatingtuzi 2010-11-11
  • 打赏
  • 举报
回复
楼上请看明题意 现在并没有析构
qq120848369 2010-11-10
  • 打赏
  • 举报
回复
class A
{
public:
A():pA1(new A1),pA2(new A2) //请看这里
{cout<<"a\n";}
~A(){cout<<"~a\n";}
private:
const auto_ptr<A1> pA1;
const auto_ptr<A2> pA2;
};

如果要强行分析,因为你声明顺序是:
const auto_ptr<A1> pA1;
const auto_ptr<A2> pA2;

所以构造函数列表先初始化pA1,即便初始化pA2抛出异常了,但你的pA1对象已经构造在栈上了,程序结束会自动析构释放指针指向的内存的.


mskmc_mc 2010-11-10
  • 打赏
  • 举报
回复
描述的不清楚
ayw215 2010-11-10
  • 打赏
  • 举报
回复
构造函数里面发生异常,是否会调用析构应该是未知的

64,654

社区成员

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

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