智能指针weak_ptr的核心源码实现

weakptr的作为弱引用指针,其实现依赖于counter的计数器类和share_ptr的赋值,构造,所以需要把counter和share_ptr也简单实现一下。

counter对象的目地就是用来申请一个块内存来存引用基数,简单实现如下:

class Counter
{
	public:
		Counter():s(0),w(0){};
		int s;
		int w;
};

s是share_ptr的引用计数,w是weak_ptr的引用计数,当w为0时,删除Counter对象。

share_ptr的简单实现如下:

template class WeakPtr;//为了用weak_ptr的lock(),来生成share_ptr用,需要拷贝构造用
template
class SharePtr
{
    public:
        SharePtr(T* p=0)
        :_ptr(p){
            cnt=new Counter();
            if(p)
	       cnt->s=1;
            cout<<"in construct "<s< const &s)
        {
            cout<<"in copy con"<s++;
            cout<<"copy construct"<<(s.cnt)->s< const &w)//为了用weak_ptr的lock(),来生成share_ptr用,需要拷贝构造用
	{
		cout<<"in w copy con "<s++;
                cout<<"copy w  construct"<<(w.cnt)->s<& operator=(SharePtr &s)
        {
            if(this != &s)
            {
                release();
                (s.cnt)->s++;
                cout<<"assign construct "<<(s.cnt)->s<()
        {
            return _ptr;
        }
	friend class WeakPtr; //方便weak_ptr与share_ptr设置引用计数和赋值。
    private:
        void release()
        {
            cnt->s--;
            cout<<"release "<s<s <1)
            {
               delete _ptr;
	       if(cnt->w <1)
	       {
			delete cnt;
			cnt=NULL;
		}
	     }
        }
        T* _ptr;
        Counter* cnt;
};
share_ptr的给出的函数接口为:构造,拷贝构造,赋值,解引用。通过release来在引用计数为0的时候删除_ptr和cnt的内存。

那么最后可以给出weak_ptr的实现,如下:

template
class WeakPtr
{
	public://给出默认构造和拷贝构造,其中拷贝构造不能有从原始指针进行构造
		  WeakPtr()
		{
			 _ptr=0;
			cnt=0;
		}
		WeakPtr(SharePtr& s):
			_ptr(s._ptr),cnt(s.cnt)
		{
			cout<<"w con s"<w++;
		}
		WeakPtr(WeakPtr& w):
			_ptr(w._ptr),cnt(w.cnt)
		{
			cnt->w++;
		}
		~WeakPtr()
		{
			release();	
		}
		WeakPtr& operator =(WeakPtr & w)
		{
			if(this != &w)
			{
				release();
				cnt=w.cnt;
				cnt->w++;
				_ptr=w._ptr;
			}
			return *this;
		}
		WeakPtr& operator =(SharePtr & s)
		{
			cout<<"w = s"<w++;
			_ptr=s._ptr;
			return *this;
		}
		SharePtr lock()
		{
			return SharePtr(*this);
		}
		bool expired()
		{
			if(cnt)
			{
				if(cnt->s >0)
				{
					cout<<"empty "<s<;//方便weak_ptr与share_ptr设置引用计数和赋值。
	private:
		void release()
		{
			if(cnt)
			{
				cnt->w--;
				cout<<"weakptr release"<w<w <1&& cnt->s <1)
				{
					//delete cnt;
					cnt=NULL;
				}
			}
		}
		T* _ptr;
		Counter* cnt;
};

share_ptr的一般接口是,通过share_ptr来构造,通过expired函数检查原始指针是否为空,lock来转化为share_ptr。

测试代码如下:

class parent;
class child;
class parent
{
    public:
       // SharePtr ch;
       WeakPtr ch;
};
class child
{
    public:
        SharePtr pt;
};
int main()
{
    //SharePtr ft(new parent());
    //SharePtr son(new child());
    //ft->ch=son;
    //son->pt=ft;
	//SharePtr son2=(ft->ch).lock();
	SharePtr i;
	WeakPtr wi(i);
	cout<
通过打开注释,可以模拟share_ptr的经典的循环引用的案例,也可以检查指针是否为空。

完整代码,加入iostream头文件和std的namespace就可以编译运行了。

你可能感兴趣的:(boost,c++)