1. 程式人生 > >C++物件生命週期管理--通過引用計數指標物件來封裝管理物件生命週期

C++物件生命週期管理--通過引用計數指標物件來封裝管理物件生命週期

在實際的軟體開發過程中,物件的生命週期管理一直是軟體開發過程中的一個重點和難點,在C++標準庫中也逐漸的出現了一系列的智慧指標(標準庫/boost庫中都涉及到),但是這種智慧指標的設計,只是對Object進行封裝,接管了相關的生命週期,但是有時候在具體的業務需求中,需要物件自己管理自己的生命週期,那麼在物件中需要封裝相關的引用計數,當引用計數為0時,需要刪除物件本身,為了滿足該業務需求,設計該基礎工具類,方便後期使用,具體程式碼如下:

#ifndef  INTRUSIVEPTR_HPP_
#define  INTRUSIVEPTR_HPP_

#include <inttypes.h>
#include <boost/thread.hpp>
#include <boost/noncopyable.hpp>

namespace ts
{
    /**
     *@brief 侵入式的引用計數管理物件生命週期[使用者需要繼承該類,只能通過new物件來進行初始化資源]
     *侵入式:需要了解基礎結構的具體實現,通過繼承等方式使用
     *非侵入式:不需要了解基礎結構的具體實現,通過配置的方式使用
     */
    template <typename T>
    class IntrusivePtr : boost::noncopyable
    { 
    //! Intrusive reference count
    //! 可以考慮把計數封裝為一個獨立的處理物件
    size_t _count;

    //! Synchornization object
    typedef boost::mutex::scoped_lock lockType;
    boost::mutex m_mutex;

    public:

    /**
    * Create an IntrusivePtr with a count. intrusive
    */
    IntrusivePtr(size_t InitialCount=1) : _count(InitialCount) {
    }

    /**
    * Destroy an IntrusivePtr
    */
    virtual ~IntrusivePtr() {}

    /**
    * Add a reference to this object, it will take one more
    * call to delReference() for it to be deleted.
    */
    void addReference() 
    {
        lockType l(m_mutex);
        ++_count;
    }

    /**
    * Remove a reference from this object, if the reference count
    * drops to 0 as a result, the object deletes itself.
    */
    void delReference() {

    bool result = false;

    {
      lockType l(m_mutex);
      result = (--_count == 0);
    }


    if(result)
      delete this;
    }
    };
};

#endif // INTRUSIVEPTR_HPP_


如程式碼中描述,具體的實現物件需要繼承該基礎類,使用者通過主動呼叫”addReference()“和”delReference()“來對引用計數進行管理,當引用計數為0時,物件被釋放