小议auto_ptr[1]

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 yecao_kinux 的 blog

    小议auto_ptr

 一直以来都以为auto_ptr是个易用的东西,虽然一直都
没有用过它.直到昨天,终于用了一下vc版本的auto_ptr,
结果许多行为令人费解.
 没有办法,又重新把stl参考书研究了一遍,随后把vc版
的auto_ptr源码翻来研究了一番,原来是.....

 有所得,总结了如下一些东东,望对初学者有所帮助.同
时,若有不对的地方望各位大虾多指教.
 
 详细解说见代码注解!

//auto_ptr.h

#ifndef auto_ptr__h__
#define auto_ptr__h__

//声明:
//1.以下源代码仅供学习.任何使用过程中所造成的后果与作者无关.
//2.如果您使用了,表示您接受该声明

//作者 古斌亮
//时间 2003.06.21
//email: kinglinux@163.com

//vc auto_ptr:仿照vc版的auto_ptr行为写的一个auto_ptr
namespace vc
{
 template<class t>
 class auto_ptr
 {
 public:
  explicit auto_ptr(t * p = null):_own(p!=0), _ptr(p){}
  
 public:
  auto_ptr(const auto_ptr<t>& y): _own(y._own), //拥有权转移到目标
   _ptr(y.release()){}
  
  auto_ptr<t>& operator=(const auto_ptr<t>& y)
  {
   if(this!=&y)
   {
    if(_ptr!=y._ptr)//是否同一个对象
    {
     if(_own)//是否具备拥有权
     {
      delete _ptr;
      _ptr = null;
     }
     _own = y._own;
    }
    else if(y._own)_own = true;
    _ptr = y.release();//拥有权转移到目标
   }
   return (*this);
  }
  
  ~auto_ptr()
  {
   if(_own)//如果具备拥有权
   {
    delete _ptr;
    _ptr = null;
   }
  }

 public:
  t& operator*() const
  {
   return (*_ptr);
  }

  t *operator->() const
  {
   return (_ptr);
  }

 public:
  t * release() const
  {
   ((auto_ptr<t>*)this)->_own = false;//拥有权转移到目标
   return (_ptr);
  }

 private:
  bool _own;//记录是否拥有权
  t *  _ptr;//引用指针
 };
};//namespace vc


//stl auto_ptr:仿照stl版的auto_ptr行为写的一个auto_ptr
namespace stl
{
 template<class t>
 class auto_ptr
 {
 public:
  explicit auto_ptr(t * p = null):_ptr(p){}
  
 public:
  auto_ptr(auto_ptr<t>& y):_ptr(y._ptr)//拥有权转移到目标
  {
   y._ptr = null;//释放拥有权
  }
  
  auto_ptr<t>& operator=(const auto_ptr<t>& y)
  {
   if(this!=&y)
   {
    if(_ptr)//释放原先拥有的对象
    {
     delete _ptr;
     _ptr = null;
    }

    _ptr = y._ptr;//拥有权转移到目标
    y._ptr = null;//释放拥有权
   }
   return (*this);
  }
  
  ~auto_ptr()
  {
   delete _ptr;//释放拥有的对象
  }

 public:
  t& operator*() const
  {
   return (*_ptr);
  }

  t *operator->() const
  {
   return (_ptr);
  }

 private:
  t *  _ptr;//指向具备拥有权对象的指针
 };
};//namespace stl

//以下的一个版本是参考<<c++标准程序库>>(the c++ standard library)
//nicolai m.josuttis 著 侯捷 孟岩 译  2002年9月
//一书 p222 6.8 提出的具备reference的auto_ptr的观点所做的一个版本
//ref auto_ptr:
namespace ref
{
 template<class t>
 class auto_ptr
 {
 public:
  explicit auto_ptr(t * p = null):_ptr(p),_count(new unsigned long(1)){}
  
 public:
  auto_ptr(auto_ptr<t>& y):_ptr(y._ptr),_count(y.addref()){}//增加引用计数
  
  auto_ptr<t>& operator=(auto_ptr<t>& y)
  {
   if(this!=&y)
   {
    if(_ptr!=y._ptr)//是否同一个对象
    {
     release();//释放自己原来的拥有权,这一步
     _ptr = y._ptr;
     _count = y.addref();//增加引用计数
    }
   }
   return (*this);

本文关键:CTL C++
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top