解析c++ 中智能指针引用计数为什么不是0原理

 更新时间:2023年08月31日 10:12:13   作者:bayes  
这篇文章主要为大家介绍了C语言中智能指针引用计数为什么不是0原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

问题示例1:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    mp.clear();
    mp.clear();
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    return 0;
}

输出:
=100,count=1
=100,count=3
=100,count=1 // 为什么这里引用计数是1而不是0呢?

问题示例2:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    return 0;
}

输出:
=100,count=1
=100,count=3
count=0 //这里为什么是0而不是2呢? 一直理解的 reset()是引用计数减1.

解析

问题1:

ptr 还在,还有一个引用。

问题2:

reset 之后,ptr 的指向改变,引用计数已经不是原来指针的引用计数了。新指针是个 nullptr ,引用计数为 0 。原来的指针引用计数是 2 ,两个引用都在 map 里,已经无法通过 ptr 访问。

  • 对于问题 1 中的第三次输出,ptr 没有释放,因此还有 1 个引用计数占用,打印 1.
  • 对于问题 2 中的第三次输出,是 ptr 这个共享指针本身释放,而非资源释放,因此 ptr.use_count() 打印 0.

可以运行下面代码验证:

#include<memory>
#include<cstdio>
#include<map>
using namespace std;
int main() {
    shared_ptr<int> ptr = make_shared<int>(100);
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    map<int, shared_ptr<int>> mp;
    mp.insert(pair<int, shared_ptr<int>>(1, ptr));
    mp.insert(pair<int, shared_ptr<int>>(2, ptr));
    printf("=%d,count=%ld\n", *ptr.get(), ptr.use_count());
    ptr.reset();
    printf("count=%ld\n", ptr.use_count());
    printf("=%d,count=%ld\n", *mp[1].get(), mp[1].use_count());
    printf("=%d,count=%ld\n", *mp[2].get(), mp[2].use_count());
    return 0;
}

输出:

=100,count=1
=100,count=3
count=0
=100,count=2
=100,count=2

函数逻辑

你可以设想一下这个函数的逻辑

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

第一步, 创造一个空shared_ptr对象,与原智能指针交换.交换后指向nullptr,引用为0;

第二步, 原始的指针成了右值, 在语句调用结束消灭, 随即, 原资源引用数减一, 如减为0, 自行消灭,否则继续留存.

 以上就是解析C语言中智能指针引用计数为什么不是0原理的详细内容,更多关于C语言智能指针引用计数的资料请关注脚本之家其它相关文章!

相关文章

  • C语言新手练习之多维数组、结构体及函数

    C语言新手练习之多维数组、结构体及函数

    这篇文章主要给大家介绍了关于C语言新手练习之多维数组、结构体及函数的相关资料,这些内容在我们日常开发中经常会遇到的,需要的朋友可以参考下
    2021-06-06
  • 剑指offer之C语言不修改数组找出重复的数字

    剑指offer之C语言不修改数组找出重复的数字

    今天小编就为大家分享一篇关于剑指offer之C语言不修改数组找出重复的数字,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • QT实现动态时钟

    QT实现动态时钟

    这篇文章主要为大家详细介绍了QT实现动态时钟,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • 纯C语言:折半查找源码分享

    纯C语言:折半查找源码分享

    这篇文章主要介绍了纯C语言:折半查找源码,有需要的朋友可以参考一下
    2014-01-01
  • 使用Qt框架制作一个表白程序

    使用Qt框架制作一个表白程序

    这篇文章主要为大家详细介绍了如何使用Qt框架制作一个表白程序,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2024-01-01
  • Qt+Quick实现播放音乐和视频的开发

    Qt+Quick实现播放音乐和视频的开发

    这篇文章主要为大家详细介绍了如何利用Qt+Quick实现播放音乐和视频的开发,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • C++调用libcurl开源库实现邮件的发送功能流程详解

    C++调用libcurl开源库实现邮件的发送功能流程详解

    libcurl是一个免费开源的网络传输库,支持ftp、ftps、tftp,http、https、telnet、ldap、pop3、smtp等多种协议,接下来让我们一起来了解吧
    2021-11-11
  • C语言链表实现贪吃蛇小游戏

    C语言链表实现贪吃蛇小游戏

    这篇文章主要为大家详细介绍了C语言链表贪吃蛇小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C++类中的常量介绍

    C++类中的常量介绍

    const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同
    2013-10-10
  • QT+OpenCV实现录屏功能

    QT+OpenCV实现录屏功能

    这篇文章主要为大家详细介绍了QT+OpenCV实现录屏功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论