zoukankan      html  css  js  c++  java
  • boost::shared_ptr

        element_type * px;                 // contained pointer
        boost::detail::shared_count pn;    // reference counter
    

      两个重要的成员:

    px, 保存被包裹的指针

    pn, 保存引用计数,pn._pi是类型为sp_counted_base的对象

    class sp_counted_base
    {
    private:
    
        sp_counted_base( sp_counted_base const & );
        sp_counted_base & operator= ( sp_counted_base const & );
    
        long use_count_;        // #shared
        long weak_count_;       // #weak + (#shared != 0)
    
    public:
    
        sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
        {
        }
    
        virtual ~sp_counted_base() // nothrow
        {
        }
    
        // dispose() is called when use_count_ drops to zero, to release
        // the resources managed by *this.
    
        virtual void dispose() = 0; // nothrow
    
        // destroy() is called when weak_count_ drops to zero.
    
        virtual void destroy() // nothrow
        {
            delete this;
        }
    
        virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
        virtual void * get_untyped_deleter() = 0;
    
        void add_ref_copy()
        {
            BOOST_INTERLOCKED_INCREMENT( &use_count_ );
        }
    
        bool add_ref_lock() // true on success
        {
            for( ;; )
            {
                long tmp = static_cast< long const volatile& >( use_count_ );
                if( tmp == 0 ) return false;
    
    #if defined( BOOST_MSVC ) && BOOST_WORKAROUND( BOOST_MSVC, == 1200 )
    
                // work around a code generation bug
    
                long tmp2 = tmp + 1;
                if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp2, tmp ) == tmp2 - 1 ) return true;
    
    #else
    
                if( BOOST_INTERLOCKED_COMPARE_EXCHANGE( &use_count_, tmp + 1, tmp ) == tmp ) return true;
    
    #endif
            }
        }
    
        void release() // nothrow
        {
            if( BOOST_INTERLOCKED_DECREMENT( &use_count_ ) == 0 )
            {
                dispose();
                weak_release();
            }
        }
    
        void weak_add_ref() // nothrow
        {
            BOOST_INTERLOCKED_INCREMENT( &weak_count_ );
        }
    
        void weak_release() // nothrow
        {
            if( BOOST_INTERLOCKED_DECREMENT( &weak_count_ ) == 0 )
            {
                destroy();
            }
        }
    
        long use_count() const // nothrow
        {
            return static_cast<long const volatile &>( use_count_ );
        }
    };
    

      

  • 相关阅读:
    [POJ 2096] Collecting Bugs
    [POJ 3774] Scout YYF I
    [HDU 4418] Time travel
    [hdu 4586] Play the Dice
    [HDU 4507] 吉哥系列故事――恨7不成妻
    [HDU 4734] F(x)
    [Codeforces] Round #352 (Div. 2)
    刷题向》关于一道像差分约束的数学题BZOJ1045(NORMAL)
    刷题向》关于一道奇怪的贪心(田忌赛马)BZOJ1034(NORMAL-)
    刷题向》关于线段树的区间开根号 BZOJ3211(NORMAL+)
  • 原文地址:https://www.cnblogs.com/long123king/p/3769782.html
Copyright © 2011-2022 走看看