shared_ptr
多个shared_pt智能指针可以使用同一块堆内存,并且该类型只能指针在实现上采用的是引用计数机制。
即使有一个shared_ptr放弃了堆内存的使用权 (引用计数减1) 也不会影响其他shared_ptr的使用 只有引用计数为0 堆内存才会释放。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| template<class T> class my_shared_ptr { private: int* _count; T* _ptr; public:
my_shared_ptr(T* ptr=nullptr){ _ptr = ptr; _count = nullptr;
if(_ptr){ _count = new int(1); } }
~my_shared_ptr(){ if(_ptr&& --(*_count)==0){ delete _ptr; } }
my_shared_ptr(const my_shared_ptr<T>& a){ _ptr = a._ptr; _count = a._count; if(_ptr){ (*_count) ++; } }
my_shared_ptr<T>& operator=(const my_shared_ptr<T>& a){ if(this != &a){ if(_ptr && --(*_count)==0){ delete _ptr; }
_ptr = a._ptr; _count = a._count;
if(_ptr){ (*_count) ++; } } }
int getCount(){ return *_count; } };
|
weak_ptr
c++11虽然将weak_ptr指针定为智能指针的一种,但是该类型指针通常不单独使用(没有实际用处)
只能和share_ptr类型指针搭配使用,甚至我们将weak_ptr视为shared_ptr的一个辅助工具
借助weak_ptr指针我们可以获得shared_ptr指针的一些状态信息
比如有多少指向相同的shared_ptr指针,share_ptr指针指向的堆内存是否释放等等
unique_ptr
unique_ptr也具备“在适当的时机自动释放堆内内存空间”的能力
和shared_ptr最大的不同之处就是在于 unique_ptr指针指向的堆内存无法将其与其他unique_str共享
也就是说unique_ptr指针都独自拥有对其所指堆内存空间的所有权
这也就是说 每个unique_str指针指向的堆内存空间的引用计数就是只能为1
一旦该unique_ptr指针放弃所致堆内存空间的所有权,该空间会被立即释放回收
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| template<class T> class my_unique_ptr { private: T* _ptr; public: my_unique_ptr(T* ptr=nullptr){ _ptr = ptr; }; ~my_unique_ptr(){ if(_ptr){ delete _ptr; _ptr = nullptr; } }; my_unique_ptr(const my_unique_ptr<T> &a) = delete; my_unique_ptr<T>& operator=(const my_unique_ptr<T> &a) = delete; };
|