智能指针.
目录
一、智能指针的使用及其原理
1.RAII
2.智能指针的原理
二、智能指针
1.auto_ptr
2.scoped_ptr
3.unique_ptr
5.weak_ptr
三、C++11与boost中智能指针的关系
一、智能指针的使用及其原理
1.RAII
2.智能指针的原理
1.RAII特性
2.重载operator*和operator->,具有像指针一样的行为
二、智能指针
1.auto_ptr
C++98版本库就提供了auto_ptr的智能指针
实现原理:拥有权的转移思想
2.scoped_ptr
该与auto_ptr最大也是唯一的区别就在于:scoped_ptr一旦获取到了数据空间的管理权,其拥有权不再转移
3.unique_ptr
C++11提供了更靠谱的unique_ptr
实现原理:简单粗暴的防拷贝
与scoped_ptr其实是完全一模一样的,只不过是换了一个名字而已
4.shared_ptr
共享型智能指针
实现原理:是通过引用计数来实现多个shared_ptr对象之间共享资源
shared_ptr在其内部,给每个资源都维护了一份计数,用来记录该份资源被几个对象共享
在对象被销毁时(也就是析构函数调用时),说明自己不使用该资源了,对象的引用计数减一
如果引用计数是0,就说明自己的最后一个使用该资源的对象,必须释放资源
如果不是0,就说明除了自己还有其他对象在使用该资源,不能释放资源,否则其他对象就成为野指针了
这里给出一个shared_ptr的简单模拟实现(示例)
#include <iostream>
#include <mutex>
#include <thread>
using namespace std;template <class T>
class SharedPtr
{
public:SharedPtr(T* p=nullptr) :_ptr(p), _pRefCount(new int(0)),m_lock(new mutex){if (_ptr != nullptr){Increment();}}SharedPtr(const SharedPtr<T>& Y) :_ptr(Y._ptr), _pRefCount(Y._pRefCount),m_lock(Y.m_lock){Increment();}SharedPtr<T>& operator=(const SharedPtr<T>& Y){if (this != &Y){Release();_ptr = Y._ptr;_pRefCount = Y._pRefCount;m_lock = Y.m_lock;Increment();}return *this;}~SharedPtr(){Release();}public:void Increment(){m_lock->lock();++(*_pRefCount);m_lock->unlock();}void Decrement(){if (_ptr != nullptr){m_lock->lock();(*_pRefCount)--;m_lock->unlock();}return *_pRefCount;}void Release(){if (Decrement()== 0){delete _ptr;delete _pRefCount;delete m_lock;}}int use_count()const{return *_pRefCount;}T* operator->(){return _ptr;}private:int* _pRefCount; //引用计数T* _ptr;mutex* m_lock;
};
4.shared_array
shared_array类似于shared_ptr,他包装了new[]操作符在堆上分配的动态数组,同样,使用引用计数机制为动态数组提供了一个代理,可以在程序的生命周期里长期存在,知道没有任何因以后才释放内存
5.weak_ptr
弱指针,其弱就在于不具备我们平时指针的功能,没有重载operator*和->
weak_ptr是为配合shared_ptr而引入的一种指针,他更像是shared_ptr的助手,按电影里来说scoped_ptr就是狙击手,weak_ptr就是观察手,最大的作用在于协助shared_ptr工作,像旁观者那样观测资源使用情况
三、C++11与boost中智能指针的关系
1.C++98中产生了第一个智能指针auto_ptr
2.C++11boost给出了更实用的scoped_ptr和shared_ptr和weak_ptr
3.C++TR1,引入了shared_ptr等,不过注意的是TR1并不是标准版的
4.C++11,引入了unique_ptr和shared_ptr和weak_ptr,需要注意的是unique_ptr对应boost库中的scoped_ptr,并且这些智能指针的实现原理是参考boost中实现的