首页 > 编程语言 >C++ 手撕--共享式智能指针(shared_ptr)的简单实现

C++ 手撕--共享式智能指针(shared_ptr)的简单实现

时间:2024-11-02 19:31:02浏览次数:5  
标签:count mtx -- C++ other Shared shared ref ptr

C++ 手撕--共享式智能指针(shared_ptr)的简单实现

共享式智能指针(shared_ptr):

#include <iostream>
#include <mutex>

using namespace std;

template<typename T>
class Shared_ptr {
private:
    T* ptr;
    int* ref_count;
    std::mutex* mtx;

    void release() {
        if (ref_count && --(*ref_count) == 0) {
            delete ptr;
            delete ref_count;
            delete mtx;
        }
    }

public:
    Shared_ptr() : ptr(nullptr), ref_count(nullptr), mtx(new std::mutex) {}

    explicit Shared_ptr(T* p) : ptr(p), ref_count(new int(1)), mtx(new std::mutex) {}

    Shared_ptr(const Shared_ptr& other) {
        std::lock_guard<std::mutex> lock(*other.mtx);
        ptr = other.ptr;
        ref_count = other.ref_count;
        mtx = other.mtx;
        if (ref_count) {
            (*ref_count)++;
        }
    }

    Shared_ptr(Shared_ptr&& other) noexcept {
        std::lock_guard<std::mutex> lock(*other.mtx);
        ptr = other.ptr;
        ref_count = other.ref_count;
        mtx = other.mtx;
        other.ptr = nullptr;
        other.ref_count = nullptr;
        other.mtx = nullptr;
    }

    Shared_ptr& operator=(const Shared_ptr& other) {
        if (this != &other) {
            std::lock_guard<std::mutex> lock1(*mtx);
            std::lock_guard<std::mutex> lock2(*other.mtx);
            release();
            ptr = other.ptr;
            ref_count = other.ref_count;
            mtx = other.mtx;
            if (ref_count) {
                (*ref_count)++;
            }
        }
        return *this;
    }

    Shared_ptr& operator=(Shared_ptr&& other) noexcept {
        if (this != &other) {
            std::lock_guard<std::mutex> lock1(*mtx);
            std::lock_guard<std::mutex> lock2(*other.mtx);
            release();
            ptr = other.ptr;
            ref_count = other.ref_count;
            mtx = other.mtx;
            other.ptr = nullptr;
            other.ref_count = nullptr;
            other.mtx = nullptr;
        }
        return *this;
    }

    T& operator*() const {
        return *ptr;
    }

    T* operator->() const {
        return ptr;
    }

    int use_count() const {
        return ref_count ? *ref_count : 0;
    }

    T* get() const {
        return ptr;
    }

    bool unique() const {
        return ref_count && *ref_count == 1;
    }

    void reset() {
        release();
        ptr = nullptr;
        ref_count = nullptr;
        mtx = nullptr;
    }

    void reset(T* p) {
        release();
        ptr = p;
        ref_count = new int(1);
        mtx = new std::mutex;
    }

    ~Shared_ptr() {
        release();
    }
};

标签:count,mtx,--,C++,other,Shared,shared,ref,ptr
From: https://www.cnblogs.com/mochacoco/p/18522125

相关文章

  • C++ 创建动态二维数组
    方法一:使用vector容器1.创建整数型二维数组先建列,再建行,先创建一个包含m个元素的向量a,再创建二维向量arr,通过push_back将一维向量作为行添加到二维向量中#include<iostream>#include<vector>usingnamespacestd;intmain(){ //创建一个包含m个元素,每个元素初始值为0......
  • 打卡信奥刷题(159)用C++工具信奥P1416[普及组/提高] 攻击火星
    攻击火星题目描述一群外星人将要攻击火星。火星的地图是一个nnn个点的无向图。这伙外星人将按照如下方法入侵,先攻击度为0......
  • 极市平台 | ECCV‘24|Plain-Det:同时支持多数据集训练的新目标检测
    本文来源公众号“极市平台”,仅用于学术分享,侵权删,干货满满。原文链接:ECCV'24|Plain-Det:同时支持多数据集训练的新目标检测极市导读论文提出了Plain-Det,提供了灵活性以适应新的数据集,具有跨多样数据集的稳健性能、训练效率和与各种检测架构的兼容性。结合Def-DETR和Plain-Det,......
  • gezelligheid
    文化体验是一个极其多样化的过程,任何一个地方的生活都包含着无数的细节和情感,这些都可能被不同的人以不同的方式解读和感受。即使同一个人,不同时间在同样的环境中也会有截然不同的体验。相逢已是上上签,何苦相思度余年,倘若回忆皆是甜,何妨心中存执念,忽有故人心上过,回首山河已是......
  • 集智书童 | 利用知识蒸馏算法优化 YOLOv5 目标检测 !
    本文来源公众号“集智书童”,仅用于学术分享,侵权删,干货满满。原文链接:利用知识蒸馏算法优化YOLOv5目标检测!这篇论文探讨了知识蒸馏技术在目标检测任务中的应用,尤其是不同蒸馏温度对学生模型性能的影响。通过将YOLOv5s作为教师网络和较小的YOLOv5s作为学生网络,作者发现,随......
  • ArcGIS005:ArcMap常用操作101-150例动图演示
    摘要:本文涵盖了GIS软件操作的多方面内容,包括地图文档的新建、打开、保存及版本兼容性处理;错误与警告的查阅及帮助文档的使用技巧;地图打印比例尺的调整与地图信息的完善;图层操作的撤销与恢复,界面元素的显示控制;模型构建与样式管理;地理与投影坐标系数据的转换与图层处理;数据链接......
  • Vue学习笔记(十七)
    4.路由4.1.【对路由的理解】4.2.【基本切换效果】Vue3中要使用vue-router的最新版本,目前是4版本。路由配置文件代码如下:import{createRouter,createWebHistory}from'vue-router'importHomefrom'@/pages/Home.vue'importNewsfrom'@/pages/News.vue'im......
  • Vue学习笔记(十八)
    4.8.【路由传参】query参数传递参数<!--跳转并携带query参数(to的字符串写法)--><router-linkto="/news/detail?a=1&b=2&content=欢迎你"> 跳转</router-link> <!--跳转并携带query参数(to的对象写法)--><RouterLink:to="{//name:'x......
  • 软件架构之论文篇(三)
    论SOA在企业集成架构设计中的应用摘要        2022年8月,我参与了胶凝砂砾石坝施工质量监控系统的开发工作,该系统旨在帮助水利工程建设法人单位、施工企业、监理机构及相关政府部门解决水利工程建设施工质量监控和工程项目管理等问题。我在该项目中担任系统分析师,......
  • Google语法(详见b站泷羽sec)
    "inurl:admin":查找包含“admin”的网页URL,可能找到管理后台入口"inurl:login":查找包含“login”的登陆页面"inurl:php?id=":查找可能存在SQL注入漏洞的PHP页面"inurl:asp?id=":查找可能存在ASP注入漏洞的PHP页面"inurl:jsp?id=":查找可能存在JSP注入漏洞的PHP页面......