前些日子,写过一个普通的智能指针,模拟的是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; }