智能指针scoped_ptr

对应C++11中的unique_ptr

 

 

 

#include <iostream>
#include <memory>

class foo
{
    public:
        foo() { std::cout<<"constructor"<<std::endl;}
        ~foo() { std::cout<<"destructor"<<std::endl; }

        void doit() { std::cout<<"do"<<std::endl; }
};

int main()
{
    std::unique_ptr<foo> sf(new foo);
    sf->doit();
    (*sf).doit();

    sf.reset(new foo);
    sf->doit();

    return 0;
}

 

  

 

 

scoped_ptr的所有权更加严格,不允许转让,对其赋值和拷贝都是不合法行为,因而显得更轻巧和快捷。

scoped_ptr重载了operator*()和operator->()解引用操作符*和箭头操作符->,因此可以把scoped_ptr对象如同指针一样使用。如果scoped_ptr保存的空指针,那么这两个操作的行为未定义。

scoped_ptr不能在两个scoped_ptr之间、scoped_ptr与原始指针之间或空指针之间进行了相等或不相等测试。operator ==和operator !=都被声明为私有。

scoped_ptr明确地表明了代码原始者的意图:只能在定义的作用域内使用,不可转让。

 

boost::scoped_ptr有着更严格的使用限制——不能拷贝。这就意味着:boost::scoped_ptr指针是不能转换其所有权的。

    1. 不能转换所有权
      boost::scoped_ptr所管理的对象生命周期仅仅局限于一个区间(该指针所在的"{}"之间),无法传到区间之外,这就意味着boost::scoped_ptr对象是不能作为函数的返回值的(std::auto_ptr可以)。
    2. 不能共享所有权
      这点和std::auto_ptr类似。这个特点一方面使得该指针简单易用。另一方面也造成了功能的薄弱——不能用于stl的容器中。
    3. 不能用于管理数组对象
      由于boost::scoped_ptr是通过delete来删除所管理对象的,而数组对象必须通过deletep[]来删除,因此boost::scoped_ptr是不能管理数组对象的,如果要管理数组对象需要使用boost::scoped_array类。

      成员函数

      功能

      operator*()

      以引用的形式访问所管理的对象的成员

      operator->()

      以指针的形式访问所管理的对象的成员

      reset()

      释放所管理的对象,管理另外一个对象

      swap(scoped_ptr& b)

      交换两个boost::scoped_ptr管理的对象

       
  1. template<class T> class scoped_ptr // noncopyable  
  2. {  
  3. private:  
  4.   
  5.     T * px;  
  6.     scoped_ptr(scoped_ptr const &);  
  7.     scoped_ptr & operator=(scoped_ptr const &);  
  8.     typedef scoped_ptr<T> this_type;  
  9.     void operator==( scoped_ptr const& ) const;  
  10.     void operator!=( scoped_ptr const& ) const;  
  11.   
  12. public:  
  13.   
  14.     typedef T element_type;  
  15.     explicit scoped_ptr( T * p = 0 ); // never throws  
  16.     explicit scoped_ptr( std::auto_ptr<T> p ); // never throws  
  17.   
  18.     ~scoped_ptr() // never throws在其作用域结束时自动删除保存的指针对象,从而正确地回收资源  
  19.     void reset(T * p = 0) // never throws删除原来保存的指针,再保存新的指针p,如果p是空指针,那scoped_ptr将不持有任何指针  
  20.     {  
  21.         BOOST_ASSERT( p == 0 || p != px ); // catch self-reset errors  
  22.         this_type(p).swap(*this);  
  23.     }  
  24.   
  25.     T & operator*() const // never throws  
  26.     {  
  27.         BOOST_ASSERT( px != 0 );  
  28.         return *px;  
  29.     }  
  30.   
  31.     T * operator->() const // never throws  
  32.     {  
  33.         BOOST_ASSERT( px != 0 );  
  34.         return px;  
  35.     }  
  36.   
  37.     T * get() const // never throws返回scoped_ptr内部保存的原始指针  
  38.     {  
  39.         return px;  
  40.     }  
  41.   
  42.     void swap(scoped_ptr & b);// never throws交换两个scoped_ptr保存的原始指针  
  43. };  
posted @ 2017-06-27 17:49  小 楼 一 夜 听 春 雨  阅读(1324)  评论(0编辑  收藏  举报