智能指针引用计数器版

前些日子,写过一个普通的智能指针,模拟的是boost中的auto_ptr,今天又写了一个关于boost中的share_ptr,引用计数器智能指针,感觉还行,功能基本实现,设计思想基本上是这么一回事,智能指针类管理资源,引用计数器类管理是否有多个智能指针指向同一个资源,如果有为这个资源设一个引用计数器,计数器值表示有多少个智能指针在使用这个资源,一旦有一个智能指针准备释放这个资源,仅仅对计数器减一,只有当没有智能指针指向这个资源,才真正的释放资源,当然你也可以强制让所有的智能指针释放这个资源,直接delete掉资源,然后将所有的智能指针delete掉。

下面是我代码:

#include <iostream>

using namespace std;


class Test
{
private:
    int n;
public:
    Test(int m):n(m)
    {}

    ~Test(){ cout<<"Test destructor function is called\n"; }

    void get(){ cout<<"Test get() is called\n"; }
};

class CountPtr
{
public:
    Test* ptr;
    int usecount;
public:
    CountPtr(Test* p):ptr(p)
    {
        usecount = 1;
        cout<<"CountPtr constructor function is called\n";
    }

    ~CountPtr(){ cout<<"CountPtr destructor function is called\n"; delete ptr;  }

};

class SmartPtr
{
private:
    CountPtr* ptr;
public:
    SmartPtr(Test* p)
    { 
        cout<<"SmartPtr constructor function is called\n";
        ptr = new CountPtr(p);
    }

    ~SmartPtr()
    {
        ptr->usecount--;
        if(ptr->usecount == 0)   //只有所有的智能指针都释放资源,才能将资源delete掉
        {
            cout<<"SmartPtr destructor function is called\n";
            delete ptr;
        }
    }

    SmartPtr(const SmartPtr& p)  //智能指针拷贝构造函数,因为有了拷贝构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视
    {
        cout<<"SmartPtr copy constructor function is called\n";
        ptr = p.ptr;
        ptr->usecount++;
    }

    SmartPtr& operator=(const SmartPtr& p)  //智能指针赋值构造函数,因为有了赋值构造函数才使其他的智能指针才能共享资源,不过这个是针对浅拷贝,深拷贝可以无视
    {
        cout<<"SmartPtr assign constructor function is called\n";
        if(this == &p)
            return *this;

        ptr->usecount--;
        if(ptr->usecount == 0)
        {
            delete ptr;
            ptr = NULL;
        }

        ptr = p.ptr;
        return *this;
    }

    Test* operator->()
    {    
        return ptr->ptr;
    }
};

int main()
{
    {
        SmartPtr ptr(new Test(8));
        ptr->get();
        SmartPtr p1 = ptr;
        SmartPtr p2(new Test(7));
        p2 = ptr;    
    }
    return 0;
}

 

posted @ 2013-01-19 22:28  GOD_YCA  阅读(1828)  评论(0编辑  收藏  举报