C++智能指针 shared_ptr + weak_ptr

前面所讲解的scoped_ptr(unique_ptr)对于拷贝构造函数和赋值运算符的重载解决方法是直接防拷贝,禁止使用这两个函数,但是不能避免的在有些场景中,我们不仅需要资源管理即初始化,资源退出即释放,我们还需要对这个对象进行拷贝或者赋值,在这种车场景下,就诞生了shared_ptr

shared_ptr


原理: 引用计数

当p1起始被创建出来以后,引用计数的值为1,当进行了赋值或者拷贝以后,p1和p2的引用计数都称为2,并且指向同意块空间

在析构的时候,首先检查 --count 是不是为0,如果是0,就释放掉对应的空间,如果非0,就只进行引用计数的减减操作

  • 拷贝构造

 sharedPtr(const sharedPtr<T>& p)
        :_ptr(p._ptr)
         ,_pCount(p._pCount)
    {
        ++*_pCount;
    }

拷贝构造很简单,就是使被拷贝的对象的引用计数+1,使拷贝的对象的成员指向被拷贝对象的成员

  • 赋值运算符的重载

赋值运算符所涉及到的情况比较多,我们需要分析一下以下的四个情况:

p1 = p2

  • 当前对象(p1)独享空间

这种情况下,p1独占资源,当进行了赋值运算的时候,p1指向的资源引用计数就会进行减减操作,减减过后,p1的引用计数为0,所以自己的空间随机被释放掉,p1指向p2的资源,同时p2指向资源的引用计数进行加加

  • 当前对象(p1)和别人共享空间

当p1的引用计数大于1的时候,证明p1所指向的资源不是独享的,还有其他的对象管理着这块资源,当进行赋值以后,p1原本指向的资源引用计数进行减减(称为1),p1再指向p2所管理的资源,再讲引用计数进行加加

  • p2._ptr == nullptr

当p2位nullptr的时候,进行赋值运算以后,p1也会指向nullptr,并且原有的资源数进行减减,如果为0,就释放

  • p1._ptr == nullptr

当p1位nullptr时,p2指向了一块资源,在赋值运算以后,p1和p2都只想p2原有资源,并且引用计数加加

赋值运算符的重载:

   sharedPtr<T>& operator=(const sharedP
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值