免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1584 | 回复: 1
打印 上一主题 下一主题

[C++] 异常时对对象的清理,在栈中和堆中不一样么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-23 13:00 |只看该作者 |倒序浏览
本帖最后由 firecityplans 于 2013-06-23 13:01 编辑
  1. #include <iostream>

  2. using namespace std;

  3. class Trace {
  4.         static int counter;
  5.         int objid;

  6. public:
  7.         Trace() {
  8.                 objid= counter++;
  9.                 cout << "constructing Trace #" << objid << endl;
  10.                 if( objid == 3 ) throw 3;
  11.         }

  12.         ~Trace() {
  13.                 cout << "destructing Trace #" << objid << endl;
  14.         }
  15. };

  16. int Trace:: counter = 0;

  17. int main() {
  18.         try{
  19.                 Trace n1 ;

  20.                 Trace array[5];

  21.                 /*Trace *n1 = new Trace;

  22.                 Trace *array = new Trace[5];*/

  23.                 Trace n2; // won't get here
  24.         }
  25.         catch( int i){
  26.                 cout << " caught" << i << endl;
  27.         }
  28. }
复制代码
打印日志如下
constructing Trace #0
  constructing Trace #1
  constructing Trace #2
  constructing Trace #3
  destructing Trace #2
  destructing Trace #1
  destructing Trace #0
  caught3
  请按任意键继续. . .

此方式下n1对象可以被销毁,而如下
  1. class Trace {
  2.         static int counter;
  3.         int objid;

  4. public:
  5.         Trace() {
  6.                 objid= counter++;
  7.                 cout << "constructing Trace #" << objid << endl;
  8.                 if( objid == 3 ) throw 3;
  9.         }

  10.         ~Trace() {
  11.                 cout << "destructing Trace #" << objid << endl;
  12.         }
  13. };

  14. int Trace:: counter = 0;

  15. int main() {
  16.         try{
  17.                
  18.                 Trace *n1 = new Trace;

  19.                 Trace *array = new Trace[5];

  20.                 Trace n2; // won't get here
  21.         }
  22.         catch( int i){
  23.                 cout << " caught" << i << endl;
  24.         }
  25. }
复制代码
打印的日志如下:
constructing Trace #0
  constructing Trace #1
  constructing Trace #2
  constructing Trace #3
  destructing Trace #2
  destructing Trace #1
  caught3

即n1没有被销毁,是何缘故?
因为一个分配在栈中,一个分析在堆中引起?

赐教!

论坛徽章:
0
2 [报告]
发表于 2013-06-23 13:47 |只看该作者
这是编译的事情,栈在离开时会调用析构函数。堆中是程序员自己决定,编译器不知道你什么时候不需要这个玩意了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP