CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于 auto_ptr 的 operator=

楼主smjacky(jacky)2005-08-17 14:59:32 在 C/C++ / C++ 语言 提问

我的程序是这样的:  
  #include   <iostream>  
  #include   <memory>  
  using   namespace   std;  
   
  template   <class   T>  
  ostream&   operator<<   (ostream&   strm,   const   auto_ptr<T>&   p)  
  {  
  if(p.get()   ==   NULL)  
  {  
  strm<<"NULL";  
  }  
  else  
  {  
  strm<<*p;  
  }  
  return   strm;  
  }  
   
  int   main()  
  {  
  auto_ptr<int>   p1(new   int(100));  
  auto_ptr<int>   p2;  
   
   
  cout<<"before   assign   ..."<<endl;  
  cout<<"p1   :   "<<p1<<endl;  
  cout<<"p2   :   "<<p2<<endl;  
   
  p2   =   p1;  
  cout<<"after   assign   ..."<<endl;  
  cout<<"p1   :   "<<p1<<endl;  
  cout<<"p2   :   "<<p2<<endl;  
   
  return   0;  
  }  
  预计的输出是:  
  before   assign   ...  
  p1   :   100  
  p2   :   NULL  
  after   assign   ...  
  p1   :   NULL  
  p2   :   100  
   
  但是实际的输出是:  
  before   assign   ...  
  p1   :   100  
  p2   :   NULL  
  after   assign   ...  
  p1   :   100   //这里有问题  
  p2   :   100  
   
  也就是说,当执行   p2   =   p1   的操作后,p1仍指向   int   对象,而并不是指向   NULL   的指针  
  根据   auto_ptr   的operaotr=   的定义,不是说当指省   p2   =   p1   的时候,p2   会指向p1的对象  
  而p1则指向   NULL   吗  
  我用的是VC6,会是编译器的问题吗  
  问题点数:20、回复次数:5Top

1 楼windywater(超级宇宙无敌大白痴)回复于 2005-08-17 15:11:15 得分 5

我以前也问过这个问题,不过现在还不是太清楚。看看这个:  
  http://community.csdn.net/Expert/topic/4203/4203530.xml?temp=.9546015  
  Top

2 楼healer_kx(甘草(楼主揭贴吧,我们这些上班灌水的也不容易))回复于 2005-08-17 15:13:01 得分 5

显然是实现的问题。  
  源码用了release,只是有个Own表示释放其所用权,但是其他的不动!这就是原理了。  
   
  但是并没有显示说p2指向设置为NULL。  
   
  代码是这么说的,我刚刚看过。Top

3 楼R9R9R9(猪头饼)回复于 2005-08-17 15:24:03 得分 5

可以是编译器的问题..在DEV-C++中的结果就如楼主所言  
  before   assign   ...  
  p1   :   100  
  p2   :   NULL  
  after   assign   ...  
  p1   :   NULL  
  p2   :   100  
  Top

4 楼foochow(无聊,灌水......)回复于 2005-08-17 15:36:23 得分 5

这个是VC中stl的bug,因为vc的stl比较早了,原来的stl中auto_ptr是有这个bug的,后来修正了,可是vc中的已经出了,这个bug就留下来了...  
  具体的可以看more   excpetion   C++....  
  vc6下的代码  
  auto_ptr<_Ty>&   operator=(const   auto_ptr<_Ty>&   _Y)   _THROW0()  
  {  
  if   (this   !=   &_Y)  
  {if   (_Ptr   !=   _Y.get())  
  {if   (_Owns)  
  delete   _Ptr;  
  _Owns   =   _Y._Owns;   }  
  else   if   (_Y._Owns)  
  _Owns   =   true;  
  _Ptr   =   _Y.release();   }  
  return   (*this);    
  }  
  //release函数  
  _Ty   *release()   const   _THROW0()  
  {  
  ((auto_ptr<_Ty>   *)this)->_Owns   =   false;  
  return   (_Ptr);    
  }  
  ............  
  从代码里看的很清楚,没有释放p1的指针,只是把p1的一个表示所有权的标志_Owns给设成false了.Top

5 楼Cocoky(我爱野百合)回复于 2005-08-17 17:13:55 得分 0

学习Top

相关问题

  • auto_ptr问题.
  • auto_ptr的问题
  • vector中能放auto_ptr吗?
  • 请教!auto_ptr的使用
  • 问关于auto_ptr和auto_ptr_ref的问题
  • auto_ptr_ref<T>干什么用的?
  • 请问大家用std::auto_ptr多吗?
  • 求助:智能指针auto_ptr
  • auto_ptr 不能作为 map 的 value 么?
  • 关于vector<auto_ptr<char> >的问题

关键词

  • release
  • p1
  • ptr
  • auto
  • owns
  • operator

得分解答快速导航

  • 帖主:smjacky
  • windywater
  • healer_kx
  • R9R9R9
  • foochow

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo