C++ shared_ptr智能指针reset()使用示例详解

 更新时间:2023年08月31日 10:14:01   作者:不停感叹的老林  
这篇文章主要为大家介绍了C++ shared_ptr智能指针reset()使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

C++ shared_ptr智能指针 reset() 详解

最近看了个问题:智能指针引用计数为什么不是0?, 问将智能指针reset后为何不是引用减一.

代码说明

#include <cstdio>
#include <memory>
auto main() -> int
{
    std::shared_ptr<int> ptr = std::make_shared<int>(100);
    auto second = ptr;
    auto third = ptr;
    printf("num = %d, count = %ld\n", *ptr, ptr.use_count());
    ptr.reset();
    printf("ptr count = %ld\n", ptr.use_count());
    printf("second and third count = %ld\n", second.use_count());
    return 0;
}

ptr调用reset后, 引用数为0, 而不是2.

reset()函数的语义

通过源码可能比较好理解:

void reset() _NOEXCEPT
    {
        shared_ptr().swap(*this);
    }

这是reset()的实现, 用shared_ptr()调用构造一个临时指针, 并将其与调用reset()的指针对象(上例中的ptr)进行交换, 原对象指向的资源变为nullptr, 引用计数变为0.

临时对象指向原指针指向的资源(上例中的100), 引用计数变为3(临时对象, second, third), 语句结束, 临时对象析构, 引用计数减一.

总结

上面的问题, 其实是没有掌握智能指针的成员函数的确切语义, 当然, 原因可能很复杂, 比如教材就说不明白, 或者望文生义, 没仔细看解释.

可能这也提醒我们, 对于标准库文档要比较熟悉, 对拿不准的看下源码, 或者做些简单测试 然后再进行使用.

以上就是C++ shared_ptr智能指针reset()使用示例详解的详细内容,更多关于C++ shared_ptr智能指针reset的资料请关注脚本之家其它相关文章!

相关文章

  • C++日期类运算符重载方式

    C++日期类运算符重载方式

    这篇文章主要介绍了C++日期类运算符重载方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 深入解读C++ 内联函数inline|nullptr

    深入解读C++ 内联函数inline|nullptr

    内联函数:用** inline 修饰的函数叫做内联函数,编译时C++编译器会在调用的地方展开内联函数**,这样调用内联函数就需要创建栈桢,就提高效率了,这篇文章给大家介绍C++ 内联函数inline|nullptr的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • C++利用inotify+epoll实现异步文件监控的方法

    C++利用inotify+epoll实现异步文件监控的方法

    这篇文章讲给大家详细介绍一下C++利用inotify+epoll实现异步文件监控的方法,inotify是一种异步文件监控机制,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • C语言 语义陷阱超详细梳理总结

    C语言 语义陷阱超详细梳理总结

    这篇文章主要介绍了C语言常见的一些语义陷阱,梳理的比较全面,对我们做开发的过程中有一定帮助,感兴趣的朋友快来看看吧
    2022-03-03
  • C语言中的二叉树和堆详解

    C语言中的二叉树和堆详解

    这篇文章主要介绍了C语言中的二叉树和堆详解,树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合,把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的,需要的朋友可以参考下
    2023-07-07
  • C语言小游戏之简易版三子棋(棋盘可自由扩展)

    C语言小游戏之简易版三子棋(棋盘可自由扩展)

    这篇文章主要为大家详细介绍了C语言实现三子棋游戏,还可以自由扩展棋盘大小,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • C语言实现简单计算器

    C语言实现简单计算器

    这篇文章主要为大家详细介绍了C语言实现简单计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++中拷贝构造函数的使用

    C++中拷贝构造函数的使用

    大家好,本篇文章主要讲的是C++中拷贝构造函数的使用,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++超详细讲解隐藏私有属性和方法的两种实现方式

    C++超详细讲解隐藏私有属性和方法的两种实现方式

    为了避免因为将类库中的私有成员开放给类的使用方而导致的软件逻辑外泄,因此需要将对外代码中的私有成员隐藏起来,下面我们来了解一下隐藏私有属性和方法的两种实现方式
    2022-05-05
  • C语言实现找出二叉树中某个值的所有路径的方法

    C语言实现找出二叉树中某个值的所有路径的方法

    这篇文章主要介绍了C语言实现找出二叉树中某个值的所有路径的方法,针对数据结构中二叉树的实用操作技巧,需要的朋友可以参考下
    2014-09-09

最新评论