shared_ptr
Posted 桃浪十七丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shared_ptr相关的知识,希望对你有一定的参考价值。
引用对象+1的情况
初始化一个
auto pPlayer = make_shared<Player>();
作为实参传递
auto p1(pPlayer);
作为函数返回值
shared_ptr pFunction(shared_ptr<Player>&);
auto p2 = pFunction(p1);
shard_ptr若在pFunction里初始化且没有变量来接它的返回值,则生命周期结束引用计数会-1
p1指向新的对象,pPlayer、p2指向的对象的计数-1,计数为0则shared_ptr的内存释放
在函数里作为形参传递,超出函数的作用域则计数-1
use_count()
返回shared_ptr的引用计数,
unique()返回是否use_count() == 1
reset
reset不带参数
auto pPlayer = make_shared();
若shared_ptr初始化的指针pPlayer是指向该对象的唯一指针,则reset释放所指向的对象,并且把pPlayer指针指向空。
若不是指向该对象的唯一指针,则指向该对象的引用计数-1,并且把指针置为空。
若reset有参数
若pPlayer是 唯一指向该对象的指针,则释放pPlayer指向的对象,让pPlayer指向新对象。
若pPlayer不是唯一指向该对象的指针,则指向该对象的引用计数-1,让pPlayer指向新对象。
可以通过reset来初始化shared_ptr
解引用*pPlayer
获得pPlayer所指向的对象。
get()函数
如pPlayer.get()返回的是内置存储的指针Player的对象
swap();
用pPlayer再实例化一个shared_ptr对象,命名为pPlayer2
可以写swap(pPlayer, pPlayer2)也可以写pPlayer.swap(pPlayer2);
给pPlayer传入一个年龄为2,pPlayer2传入10,通过打印所指向对象的年龄可以看出,调用swap交换了两者所指向的对象。
= nullptr
将所指向的对象的引用计数-1,若引用计数为0,则智能指针释放指针所指向的对象
把智能指针置为空
shared_ptr作为判断条件,如
if(pPlayer) // TODO
自定义删除器
void myDelete(int *p) delete p;
shared_ptr<int> p(new int(12345), myDelete);
shared_ptr管理动态数组的时候则需要自定义删除器
也可以default_delete,如shared_ptr (new Player[10], std::default_delete<A[]>());
一种不用自定义删除器的写法shared_ptr<Player[]> p(new Player[]);
————————————————————————————————————————
后续待补充。。。。
以上是关于shared_ptr的主要内容,如果未能解决你的问题,请参考以下文章
返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?