智能指针shared_ptr的简化实现

本文解析了C++标准库中的shared_ptr如何通过引用计数自动管理资源释放,介绍了其内部结构与关键操作,如构造、赋值和析构。重点讨论了引用计数和弱引用计数在资源控制中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shared_ptr采用对象管理资源,通过引用计数自动控制资源的释放时机。

实现时需要注意:

  • 一个shared_ptr对象具有两个裸指针,这点通过sizeof可简单确定。其中,一个裸指针用于管理使用时分配的资源(实例中 _ptr);另一个用于记录对象信息(示例中_ref
  • 用于记录对象信息的结构体至少包含两个引用计数,即(正常的)引用计数(示例中shared_count)和弱引用计数(示例中weak_count),二者均为原子类型。_ptr所分配的资源是否释放只与shared_count的值有关
#include <iostream>
#include <atomic>

struct Ref
{
    Ref():shared_count(1), weak_count(0){}
    std::atomic<int> shared_count;
    std::atomic<int> weak_count;
};

template <typename T>
class SharedPtr {
public:
    SharedPtr(T *p = nullptr) {
        _ptr = p;
        _ref = new Ref();
    }
    SharedPtr(const SharedPtr<T> &rv) {
        _ptr = rv._ptr;
        _ref = rv._ref;
        AddRefCount();
    }

    SharedPtr<T>& operator=(const SharedPtr<T>& rv) {
        if (_ptr != rv._ptr) {
            Release();
            _ptr = rv._ptr;
            _ref = rv._ref;
            AddRefCount();
        }
        return *this;
    }

    ~ SharedPtr() {
        Release();
    }

    T& operator *() {
        return *_ptr;
    }
    T* operator->() {
        return _ptr;
    }
    T* get() {
        return _ptr;
    }

    int UseCount() {
        return _ref->shared_count;
    }

private:
    void AddRefCount() {
        ++ _ref->shared_count;
    }
    void Release() {
        if (--_ref->shared_count == 0) {
            delete _ptr;
            delete _ref;
        }
    }
private:
    T *_ptr;
    Ref *_ref;
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值