Modern C++ std::shared_ptr的实现原理

本文详细介绍了C++ std::shared_ptr的实现原理,包括其UML图、数据成员、构造过程、引用计数的原子操作、use_count()的无锁实现以及析构行为。通过实例解析,阐述了shared_ptr如何处理复制和引用计数的增加,同时探讨了在多线程环境下的原子操作机制。
摘要由CSDN通过智能技术生成

shared_ptr的UML图

注意:这是Linux上GCC 8.5.0的实现版本
先看下它的继承关系。
请添加图片描述

shared_ptr里面的数据成员

有了上面的UML图,可能还没有一个直观的认识,下面我们把这些成员打印出来。
当然得先写个小小的程序:

$ cat shared_ptr.cpp
#include <memory>
#include <iostream>

int main(){
   
        int* ip = new int(100);
        std::shared_ptr<int> is1(ip);
        std::shared_ptr<int> is2(is1);
        std::cout<<"use count:"<<is2.use_count()<<std::endl;
        return 0;
}

is1构造完后,看下它的值:
在这里插入图片描述
is1有两个成员变量:

  1. _M_ptr: 为真正的指针的值,本例中即整形的地址。
  2. _M_refcount: 为__shared_count类型,仅包含一个指针,这个指针指向new出来的另外一个对象它包含两个整形成员(_M_use_count, _M_weak_count)

从内存角度看图是这样的:
在这里插入图片描述

小知识点:private是限制编译的,GDB是能访问它修饰的成员变量的。

shared_ptr的构造

相信看完上面的各种图和数据,大家应该能想想出来构造的过程。
这次我们step into第六行
在这里插入图片描述
shared_ptr的构造函数调用了基类__shared_ptr的构造函数
在这里插入图片描述
之后new了一个_Sp_counted_ptr,我就不一步步走下去了。

另外提一句,_M_use_count和_M_weak_count都是_Atomic_word类型,其实就是int。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山老宅

鸡蛋不错的话,要不要激励下母鸡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值