首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

临时对象的析构解决办法

2012-05-01 
临时对象的析构class Rec{public:int aint bfriend ostream & operator(ostream &os,Rec& b){os[

临时对象的析构
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;

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

热点排行