读书人

临时对象的析构解决办法

发布时间: 2012-05-01 12:48:58 作者: rapoo

临时对象的析构
class Rec
{
public:
int a;
int b;
friend ostream & operator<<(ostream &os,Rec& b)
{
os<<"["<<b.a<<"]";
return os;
}
Rec(){ a=1;b=1;}
~Rec() {};
Rec(const Rec& rec)
{
a = rec.a;
b = rec.b;
}
const Rec& operator=(const Rec& rec)
{
a = rec.a;
b = rec.b;
return *this;
}
};

Rec funRec(Rec& obj)
{
return obj;
}


int _tmain(int argc, _TCHAR* argv[])
{
Rec obj;
Rec *ptr = &(funRec(obj));
Rec &ano = funRec(obj);

ptr->a = 2;
ano.a = 2;
return 1;
}
既然funRec返回的是值对象,那么ptr指向的临时对象在Rec *ptr = &(funRec(obj))执行完成后就会析构,但是ptr->a = 2可以赋值,这是为什么?
下面ano也是同样,既然是一个临时对象的引用,那么Rec &ano = funRec(obj)完成后临时对象会析构,而后面的ano.a = 2也能正常运行。

经过调试发现,ptr指向的临时对象在Rec *ptr = &(funRec(obj))执行完成后确实调用了析构函数,而ano引用的析构函数是在main函数结果的时候析构的,这个是什么原因?

[解决办法]
第一个,很显然ptr肯定直接析构。
第二个,传给引用之后,得等 引用变量的生命周期结束才析构。
而这里,ano生命周期在 main函数结束才结束,所以出现了你上面调试的结果。
[解决办法]
内存模型释放不是立即进行的只是把那块区域标记为废弃
可以访问和赋值是正常的因为你没有置空
但是永远不要依赖这种未定的行为,它们是及其危险的
[解决办法]
但是ptr->a = 2可以赋值,这是为什么?
搜索野指针,本来就可以赋值,但这块内存已经被释放了,容易导致未定义的行为。

ano引用的析构函数是在main函数结果的时候析构的,这个是什么原因?

ano引用的对象不是在main函数结束的时候析构,可以写如下代码来证明;

//obj对象,这个对象是在main函数结束的时候析构的
Rec obj;
obj.a = 1;
//这里有2个临时对象,临时对象的析构在函数调用完的时候就完成了。
Rec *ptr = &(funRec(obj));
Rec &ano = funRec(obj);

ptr->a = 2;
obj.a = 2;

//打印出1 证明ano指向的不是obj而是funRec返回的临时对象。
cout<<ano.a<<endl;

楼主可以再去看看变量作用域的基础知识。

读书人网 >C++

热点推荐