代码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()函数体.遇到' } ' 时程序终止,因而少两个析构函数
}