• shared_ptr


    引用对象+1的情况

    初始化一个

    auto pPlayer = make_shared<Player>();
    
    • 1

    作为实参传递

    auto p1(pPlayer);
    
    • 1

    作为函数返回值

    shared_ptr pFunction(shared_ptr<Player>&)auto p2 = pFunction(p1);
    
    • 1
    • 2

    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  }
    
    • 1

    自定义删除器

    void myDelete(int  *p) { delete p; }
    shared_ptr<int> p(new int(12345),  myDelete);
    
    • 1
    • 2

    shared_ptr管理动态数组的时候则需要自定义删除器
    也可以default_delete,如shared_ptr (new Player[10], std::default_delete());
    一种不用自定义删除器的写法shared_ptr p(new Player[]);

    ————————————————————————————————————————

    后续待补充。。。。

  • 相关阅读:
    SpringMVC的上传下载
    开学季哪些数码产品值得一看?开学季推荐五款值得入手的好物
    mysql实现一次将多条不同sql查询结果并封装到一个结果集
    洛谷 P3128 [USACO15DEC] Max Flow P
    山东涛雒镇万亩水稻 国稻种芯·中国水稻节:日照迎来收割季
    Ps:红眼工具
    GPT-4:论文阅读笔记
    30+程序员辞职3年上岸985,妻子赚钱供父子俩读书,网友却泼冷水
    Building Systems with the ChatGPT API
    el-tooltip在el-table-column的使用
  • 原文地址:https://blog.csdn.net/alodonoa/article/details/126070032