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_ );
        }
    };
    

      

  • 相关阅读:
    类加载,初始化
    jvm classLoader architecture
    只选择年份的下拉菜单
    spring框架学习(二)依赖注入
    spring框架学习(一)
    JSP 过滤器
    JSP9个内置对象
    JSP 动作元素
    众数
    基于excel9.h的excel处理
  • 原文地址:https://www.cnblogs.com/long123king/p/3769782.html
Copyright © 2011-2022 走看看