临时对象生命周期问题

代码1:

#include<iostream>
using namespace std;
class C
{
public:
int ff;
C()
{
   ff=10;
}
~C()
{
cout<<"我死了"<<this<<endl;
}
};

static C *a;

C func()
{
C t;
return t;
};

void test()
{
      a=&func();//这里将把临时对象析构
      cout<<"看看a的值吧"<<a->ff<<endl;   //这竟然还能打出来10
};
int main(int argc,char rgv[])
{
test();
cout <<"test函数死了"<<endl;
cout <<"再看看a的值吧"<<a->ff<<endl;//这里已经打不出来10了
C t=*a;
return 0;
}
 

输出结果:

我死了0012FEB4
我死了0012FF20
看看a的值吧10
test函数死了
再看看a的值吧1245056
我死了0012FF7C

向临时对象问题

一般认为:

> > 临时对象的作用域仅仅是该对象产生的表达式, 临时对象的生命周期被定义在一个语句的结束前,也就是说语句结束了,临时对象生命周期也就结束了。
> > 越过此表达式临时对象则被销毁,
> > 如果在运行时引用该临时对象,
> > 则会发生运行时刻异常。

不过经过程序试验发现临时对象的释放是在语句结束时,可好像回收要等程序返回时才回收。

 代码2:

#include<iostream.h>
class A
{
public:
 A()
 {
  cout<<"construct A"<<endl;
 }
 
    ~A()
 {
  cout<<"deconstruct A"<<endl;
 }
};
void main()
{
 A* p;
 p=new A[2]; //调用两次构造函数
 p[0]=A();   //生成一个临时对象,生命周期为表达式语句结束.调用一次构造,一次析构
 p[1]=A();   //生成一个临时对象,生命周期为表达式语句结束.调用一次构造,一次析构
 delete []p;  //只有调用delete才能看到p[0]和p[1]的析构函数,若没有delete,则少两个destructor A.原因:p[0]和p[1]的生命周期为main()函数体.遇到' } ' 时程序终止,因而少两个析构函数
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值