> 文章列表 > 智能指针.

智能指针.

智能指针.

目录

一、智能指针的使用及其原理

1.RAII

2.智能指针的原理

二、智能指针

1.auto_ptr

2.scoped_ptr

3.unique_ptr

4.shared_ptr

4.shared_array

5.weak_ptr

三、C++11与boost中智能指针的关系


一、智能指针的使用及其原理

1.RAII

RAIIResource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源的简单技术
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。
这种做法有两大好处:
不需要显式地释放资源
采用这种方式,对象所需的资源在其生命期内始终保持有效

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中实现的