zoukankan      html  css  js  c++  java
  • 智能指针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. };  
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/kex1n/p/7086428.html
Copyright © 2011-2022 走看看