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的主要内容,如果未能解决你的问题,请参考以下文章

c++11智能指针(一) shared_ptr

boost库之内存管理shared_ptr

返回 boost::shared_ptr 和从返回的原始指针构造 boost::shared_ptr 有啥区别?

格式工厂shared_ptr

识别已将哪个基类 shared_ptr 传递到超类 shared_ptr 向量中

shared_ptr(作为局部变量返回)