C++物件生命週期管理--通過引用計數指標物件來封裝管理物件生命週期
阿新 • • 發佈:2019-02-10
在實際的軟體開發過程中,物件的生命週期管理一直是軟體開發過程中的一個重點和難點,在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時,物件被釋放