智能指针.

目录

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

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

RAII Resource 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 
#include 
#include 
using namespace std;

template 
class SharedPtr
{
public:
	SharedPtr(T* p=nullptr) :_ptr(p), _pRefCount(new int(0)),m_lock(new mutex)
	{
		if (_ptr != nullptr)
		{
			Increment();
		}
	}

	SharedPtr(const SharedPtr& Y) :_ptr(Y._ptr), _pRefCount(Y._pRefCount),m_lock(Y.m_lock)
	{
		Increment();
	}

	SharedPtr& operator=(const SharedPtr& 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中实现的

你可能感兴趣的:(c++,智能指针)