智能指针——unique_ptr、shared_ptr、weak_ptr、make_shared()

智能指针删除器,利用类模板特例化

C++11 unique_ptr智能指针详解

1.独占性,唯一性智能指针 unique_ptr

在这里插入图片描述
多对象使用

// 单个对象
auto_ptr<Obj> pa(new Obj(10));
// 多个对象
unique_ptr<Obj[]> up_obji(new Obj[3]);
// 模板参数列表传入,删除器(函数对象,即仿函数)
unique_ptr<Obj, default_delete<Obj[]>> up_obja(new Obj[3]);
unique_ptr<Obj[], default_delete<Obj[]>> up_objb(new Obj[3]);	// 其实第一个参数已经说明问题,第二个参数无用
// 在参数列表,通过构造函数传入函数对象
//unique_ptr<Obj> up_objc(new Obj[3], default_delete<Obj[]>()); // error,根据模板参数调用的是普通版本,而函数参数是多对象,参数列表不符
unique_ptr<Obj[]> up_objc(new Obj[3], default_delete<Obj[]>());

2.共享性智能指针 shared_ptr

C++11 shared_ptr智能指针(超级详细)

构建方法:
在这里插入图片描述
注意:不可用同一片空间申请多个智能指针
在这里插入图片描述
特例化删除
在这里插入图片描述

// 单个对象
shared_ptr<Obj> psa(new Obj(10));
// 多个对象
shared_ptr<Obj[]> psb(new Obj[3]{1,2,3});
// mark_shared构建
shared_ptr<Obj> psc = make_shared<Obj>(10);	//好像一次只能构建一个对象,但这种方法更安全,效率更高,更节省空间
void deleter(Obj* p) { delete[]p; }
struct Delete{
	void operator()(Obj * p) { delete[]p; }
};
int mian()
{
	shared_ptr<Obj> sp_obja(new Obj[10](), default_delete<Obj[]>());	// 类提供的多对象销毁
	shared_ptr<Obj> sp_objb(new Obj[10](), deleter);	// 传入函数
	shared_ptr<Obj> sp_objc(new Obj[10](), default_delete<Obj[]>());	// 仿函数
	shared_ptr<Obj> sp_objd(new Obj[10](), [](Obj* p) {delete[]p; });	// 匿名函数
	//shared_ptr<Obj> sp_objc(new Obj[10]());  必须指明是多个对象析构,除非是内置类型(无析构函数)
}

mark_shared 优点

C++11使用make_shared的优势和劣势
在这里插入图片描述
具体看结尾处的补充。

注意:相互引用问题
在这里插入图片描述
在这里插入图片描述
即下图所示:
在这里插入图片描述

相互循环引用,会造成两个智能指针的引用计数都不会为0,则互相都不会被释放。最终造成内存泄漏。

解决方案:使用弱指针,观察器
在这里插入图片描述

3.weak_ptr

实现原理
在这里插入图片描述
weak_ptr 赋值后,引用计数指向mCnt_w 。

C++干货系列——你该如何优雅地构造shared_ptr?

std::weak_ptr其实可以看成shared_ptr的一个搭档,就是为了解决shared_ptr成环问题而存在的:它自己并不拥有对动态对象的管辖权,自己指向shared_ptr的目标也不会增加计数器的值,相反,它自己拥有一套不纳入计数器的指针系统。
在这里插入图片描述

make_shared
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在函数传递参数时,尽可能的使用make_shared的方式,因为C++17之前此语句的执行顺序时,先new一个对象,再传递could…()函数,最后构建shared_ptr对象。 如果could…()函数抛出异常,则我们的shared_ptr智能指针还没有构建程序就结束了,new出的空间没有被释放,造成内存泄漏。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值