C++:智能指针(2)——shared_ptr引用计数功能,weak_ptr解决循环引用

本文详细介绍了C++中的shared_ptr,包括其引用计数机制和如何处理循环引用问题。通过实例展示了shared_ptr导致的循环引用,以及如何使用weak_ptr打破这种循环,确保资源的正确释放。同时,解释了weak_ptr的作用和使用场景。
摘要由CSDN通过智能技术生成

上一篇文章 C++:智能指针(1)——auto_ptr, unique_ptr的区别已经介绍了auto_ptr与unique_ptr;如果有疑惑的同学可以查看;

shared_ptr

shared_ptr是原始指针的封装类。它是一个附加了引用计数所有权模型,即它与shared_ptr的所有副本协作维护其包含的指针的引用计数。因此,每当一个新的指针指向资源时,计数器就会增加,而在调用对象的析构函数时,计数器就会减少。

引用计数一种用于存储对资源(例如对象,内存块,磁盘空间或其他资源)的引用,指针或句柄数量的技术。 在引用计数大于零之前,即直到删除了shared_ptr的所有副本之前,原始指针指向的堆内存不会被释放。 因此,当我们要将一个原始指针分配给多个所有者时,应该使用shared_ptr。
源码

template<class _Tp>
class _LIBCPP_TEMPLATE_VIS shared_ptr
{
   
public:
    typedef _Tp element_type;

#if _LIBCPP_STD_VER > 14
    typedef weak_ptr<_Tp> weak_type;
#endif
private:
    element_type*      __ptr_;
    __shared_weak_count* __cntrl_;
    ...
}

析构函数调用栈

template<class _Tp>
shared_ptr<_Tp>::~shared_ptr()
{
   
    if (__cntrl_)
        __cntrl_->__release_shared();
}

    void __release_shared() _NOEXCEPT {
   
      if (__shared_count::__release_shared())
        __release_weak();
    }
    
	    bool __release_shared() _NOEXCEPT {
   
	      if (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值