共享对象的实现

来源:互联网 发布:unity3d 导入fbx 编辑:程序博客网 时间:2024/05/18 05:18

        之前项目中遇到一个问题,项目用到了boost库中的sharearray(记不清是不是叫这个名字),但是苦于总是编译出错,于是乎就自己写了一个。写完发现这种思想挺好的,就花了点时间完善了一下。

        直接上代码:

template<class T> class ShareObject{typedef void (*Deleter)(T*);public:inline ShareObject():m_handle(0),m_ptr(0)//,iDeleter(0){}{}ShareObject(T* ptr):m_handle(0),m_ptr(ptr)//,iDeleter(0){    typedef char type_must_be_complete[sizeof(T)?1:-1];(void) sizeof(type_must_be_complete);if (ptr){m_handle = new int(1);*m_handle = 1;    }}ShareObject(T* ptr, Deleter aDeleter):m_handle(0),m_ptr(ptr)//, iDeleter(aDeleter)    {    if (ptr)    {        m_handle = new int(1);        *m_handle = 1;    }    }ShareObject(const ShareObject& s):m_handle(s.m_handle), m_ptr(s.m_ptr)//, iDeleter(s.iDeleter){if (m_handle)(*m_handle)++;}ShareObject& operator=(const ShareObject& s){    if (s.m_handle == this->m_handle)        return (*this);    if (s.m_handle)(*s.m_handle)++;//s.m_handle->Ref();if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);}}m_handle = s.m_handle;m_ptr = s.m_ptr;//iDeleter = s.iDeleter;return *this;}ShareObject& operator=(T* ptr){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);m_ptr = 0;}}//iDeleter = 0;m_ptr = ptr;if (m_ptr){    m_handle = new int(1);    *m_handle = 1;}elsem_handle = 0;return *this;}~ShareObject(){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;//if (iDeleter == 0)delete m_ptr;//else//iDeleter(m_ptr);m_ptr = 0;}}}#if 0T* Peel(){delete m_handle;m_handle = 0;T* p = m_ptr;m_ptr = 0;return p;}#endifinline T* Ptr() const{return m_ptr;}inline T* get() const{return m_ptr;}inline T* operator()() const{return m_ptr;}inline bool operator!() const{return (m_ptr == 0 ? true : false);}inline T* operator->() const{return m_ptr;}inline T& Object() const{return (T&)(*m_ptr);}public:int* m_handle;T* m_ptr;//Deleter iDeleter;};/*** *  */template<class T> class ShareArray{typedef void (*Deleter)(T*);public://inline ShareArray():m_handle(0),m_ptr(0),iDeleter(0){}ShareArray(T* ptr):m_handle(0),m_ptr(ptr),iDeleter(0){typedef char type_must_be_complete[sizeof(T)?1:-1];(void) sizeof(type_must_be_complete);if (ptr)m_handle = new int(1);}ShareArray(T* ptr, Deleter aDeleter):m_handle(0),m_ptr(ptr), iDeleter(aDeleter){if (ptr)m_handle = new int(1);}ShareArray(const ShareArray& s):m_handle(s.m_handle), m_ptr(s.m_ptr), iDeleter(s.iDeleter){if (m_handle)(*m_handle)++;//m_handle->Ref();}ShareArray& operator=(const ShareArray& s){    if (s.m_handle == this->m_handle)        return (*this);    if (s.m_handle)(*s.m_handle)++;//s.m_handle->Ref();if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);}}m_handle = s.m_handle;m_ptr = s.m_ptr;iDeleter = s.iDeleter;return *this;}ShareArray& operator=(T* ptr){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);m_ptr = 0;}}iDeleter = 0;m_ptr = ptr;if (m_ptr)    m_handle = new int (1);elsem_handle = 0;return *this;}~ShareArray(){if (m_handle){//int r = m_handle->Deref();if (--(*m_handle) <= 0){delete m_handle;m_handle = 0;if (iDeleter == 0)delete [] m_ptr;elseiDeleter(m_ptr);m_ptr = 0;}}}T* Peel(){delete m_handle;m_handle = 0;T* p = m_ptr;m_ptr = 0;return p;}inline T* Ptr() const{return m_ptr;}inline T* get() const{return m_ptr;}inline T* operator()() const{return m_ptr;}inline bool operator!() const{return (m_ptr == 0 ? true : false);}inline T* operator->() const{return m_ptr;}public:int* m_handle;T* m_ptr;Deleter iDeleter;};


        这种机制的最大好处在于,不用显示delete一个指针,而且可以共享对象,就像它的名字一样。