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的资料请关注脚本之家其它相关文章!

相关文章

  • Qt模仿Visual Studio停靠窗口效果

    Qt模仿Visual Studio停靠窗口效果

    这篇文章主要介绍了如何利用Qt制作与Visual Studio相似的带有停靠方向标及停靠区域预览的停靠窗口框架,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2022-01-01
  • C语言实现三子棋

    C语言实现三子棋

    这篇文章主要为大家详细介绍了C语言实现三子棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • 一文带你彻底看懂C++常见排序算法

    一文带你彻底看懂C++常见排序算法

    在计算机科学中,排序算法是数据处理的基础工具,这篇文章主要介绍了C++常见排序算法的相关资料,文中通过代码介绍的非常详细,对大家学习或者使用C++具有一定的参考借鉴价值,需要的朋友可以参考下
    2026-01-01
  • C++ Hjson-cpp处理JSON类型配置文件详解

    C++ Hjson-cpp处理JSON类型配置文件详解

    Hjson-Cpp是C++实现的Hjson解析库,支持注释、多行字符串等更友好的语法,适用于配置文件等场景,下面我们就来看看它的具体使用方法吧
    2025-06-06
  • C和C++的区别详解

    C和C++的区别详解

    这篇文章主要介绍了C和C++之间的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-10-10
  • C语言字符函数isalnum()和iscntrl()详解

    C语言字符函数isalnum()和iscntrl()详解

    大家好,本篇文章主要讲的是C语言字符函数isalnum()和iscntrl()详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C语言复数的加减及输出结构体

    C语言复数的加减及输出结构体

    大家好,本篇文章主要讲的是C语言复数的加减及输出结构体,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02
  • C++实现正整数的四则运算表达式

    C++实现正整数的四则运算表达式

    这篇文章主要为大家详细介绍了C++实现正整数的四则运算表达式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • C++11 <future>中std::promise 介绍

    C++11 <future>中std::promise 介绍

    这篇文章主要介绍了C++11 <future>中std::promise 介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言中栈的大小设置方式

    C语言中栈的大小设置方式

    文章介绍了C语言中局部变量存储在栈中,并讨论了避免栈溢出和优化栈使用的方法,在STM32开发中,可以通过修改启动文件或使用STM32CubeMX来设置栈和堆的大小,同时,通过查看生成的.map文件或.htm文件,可以了解栈的使用情况并进行优化
    2026-02-02

最新评论