为何使用智能指针?
- 因为能帮我们管理内存,避免内存泄漏
- 能帮我们处理空悬指针(俗称野指针,即delete掉指针后,原来的指针指向了垃圾区域)的问题
智能指针的类型
- shared_ptr: 多个智能指针指向同一块区域,该对象会在最后一个引用被销毁时释放。
- unique_ptr: 每个对象只能有一个智能指针指向它,避免资源泄漏。
shared_ptr的实现
详见 SmartPtr
类的内部细节如下:
内部ptr保留的是真实的指针,由该类来自动维护它
count是对真实指针引用的计数
1 2 3 4 5 6 7 8 9 10 11 12
| template<class T> class sharedPtr { private: T* ptr; int* count; public: sharedPtr(); sharedPtr(T*); ~sharedPtr(); sharedPtr(const sharedPtr<T>& t); sharedPtr<T>& operator=(const sharedPtr<T>& right); };
|
对于 p1(p2)这种复制构造,事实上是将参数的count加一,即又增加了对资源的引用
1 2 3 4 5 6 7 8
| template<class T> sharedPtr<T>::sharedPtr(const sharedPtr<T>& t) { ptr = t.ptr; count = t.count; (*count)++; cout << "copy from " << &t << "to" << this << endl; }
|
对于p2 = p2这种复制构造,事实上是将右侧的的count减一,将左侧的count减一,减后进行判断是否要进行资源的释放来自行维护。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| template<class T> sharedPtr<T>& sharedPtr<T>::operator=(const sharedPtr<T>& right) { (*right.count)++; (*count)--; if (*count == 0) { delete ptr; delete count; ptr = nullptr; count = nullptr; cout << "delete left element:" << this << endl; } ptr = right.ptr; count = right.count; cout << "copy right to left" << endl; return *this; }
|