智能指针-shared_ptr

文章详细介绍了C++中的智能指针shared_ptr的作用和使用方式,包括通过原生指针构造、make_shared的使用以及get、reset、use_count等成员函数的功能。此外,还展示了shared_ptr的简易实现,强调了引用计数的线程安全和内存管理的自动化。

前言

  shared_ptr作为最被广泛使用的一种智能指针,其作用就是智能管理原生指针,在合适的时候将堆内存释放掉。而开发人员就能够从繁琐且细致的指针释放问题上抽离开来,大大方便了开发人员。

使用

shared_ptr的创建:
  使用原生指针构造智能指针;
  创建空智能指针,再用make_shared来返回一个智能指针进行初始化;
  使用一个智能指针来构造/初始化另一个空智能指针;

shared_ptr的行为:
  get();返回智能指针保存的原生指针;
  reset();将智能指针的指针置为空,并释放所指向内存;
  use_count();返回当前智能指针的引用计数;
  make_shared(Args…args);返回一个智能指针,其指向一块新的堆内存,并根据函数参数来构造这块内存;
  示例代码:

	int* pt = new int();//原生指针
	shared_ptr<int> ptr;//count=0,pointer = nullptr
	shared_ptr<int> ptr1(pt);//count = 1
	shared_ptr<int> ptr2(ptr1);//count = 2
	shared_ptr<int> ptr3 = make_shared<int>(1);
	cout << ptr2.use_count() << endl;//cout "2"
	ptr2.reset();
	cout << ptr2.get() << endl;//cout "0x00000000"

实现

  试着自己实现一个shared_ptr模板类:

#include <atomic>

#define SafeDelete(p) if(p){p = nullptr;delete p}

template<typename T>//类模板
class shared_ptr
{
private:
	std::atomic<int*> count;//引用计数-原子操作,保证线程安全
	T * pointer;//原生指针
public:
	shared_ptr() :count(new int(0)), pointer(nullptr)//空构造
	{

	}
	shared_ptr(T *ptr) :count(new int(1)), pointer(ptr)//原始指针构造
	{

	}
	shared_ptr(const shared_ptr &ptr) :(count)(ptr->count), pointer(ptr->pointer)//拷贝构造函数
	{
		(*count)++;
	}
	~shared_ptr()
	{
		(*count)--;
		if ((*count) == 0)
		{
			SafeDelete(count);//释放引用计数指针
			SafeDelete(pointer);//释放内存
		}
	}
	/*主要介绍一下这个函数:
	首先这个运用了c++11新增的可变参数模板,其中Typename... Args表示类型不定的类型参数列表;其次Args... args表示数目不定的函数参数列表,这里就可以实现不定长、不定类型的函数参数声明;
	std::forward是完美转发,意思是能够精确转发args的左值属性或者右值属性
	*/
	template<typename... Args>
	shared_ptr<T> & make_shared(const Args& ... args)
	{
		return shared_ptr(new T(std::forward<Args>(args)...));
	}
	//重载运算符*
	T& operator *() const
	{
		return *pointer;
	}
	//重载运算符->
	T* operator ->() const
	{
		return pointer;
	}
	//get返回原生指针
	T* get()
	{
		return pointer;
	}
	//返回引用计数
	int use_count()
	{
		return *count;
	}
};

  好了,我们后面再见~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值