C++ Share Ptr

来源:互联网 发布:apache tomcat.exe 编辑:程序博客网 时间:2024/05/22 19:12

看了boost的share_ptr,觉得比较复杂,感觉也就是个引用计数的问题,所以就自己写了一个


template <typename T>
class ZSharePtr
{
private:
    int *count;
    T *ptr;
public:
    typedef T element_type;
    typedef T value_type;
    typedef T * pointer;
    typedef T& reference;
    ZSharePtr():ptr(0),count(0) { }
    ZSharePtr(const ZSharePtr& p):ptr(p.ptr),count(p.count)
    {
        if ( count != 0 ) addref();
    }
    ZSharePtr(T* p): ptr(p), count(0)
    {
        count = new int;
    }
    virtual ~ZSharePtr()
    {
        _release();
    }
    reference operator*() const
    {
        ZASSERT(ptr!=0);
        return *ptr;
    }
    T* operator->() const
    {
        ZASSERT(ptr!=0);
        return ptr;
    }
    T* get() const
    {
        ZASSERT(ptr!=0);
        return ptr;
    }
    bool operator!() const
    {
        return ptr == 0;
    }
    ZSharePtr& operator=(const ZSharePtr& rhs)
    {
        if ( rhs.ptr == ptr ) return *this;
        _release();
        ptr = rhs.ptr;
        count = rhs.count;
        return *this;
    }

protected:
    int addref()
    {
        ZASSERT(count != 0);
        return ++(*count);
    }

    int decref()
    {
        ZASSERT(count != 0);
        return --(*count);
    }

    virtual void free()
    {
        if (ptr)
        {
            delete ptr;
            ptr = 0;
        }
    }

    void set_ptr(T* ptr)
    {
        ptr = ptr;
    }

    T* get_ptr() const
    {
        return ptr;
    }

    void _release()
    {
        if ( count == 0 ) return;
        if ( decref() == 0 )
        {
            delete count;
            count = 0;
            free();
        }
    }
};

template<typename T, typename U>
inline bool operator== (const ZSharePtr<T>& lhs, const ZSharePtr<U> rhs)
{
    return lhs.get()==rhs.get();
}

template<typename T, typename U>
inline bool operator!= (const ZSharePtr<T>& lhs, const ZSharePtr<U> rhs)
{
    return lhs.get()!=rhs.get();
}

原创粉丝点击