首页 > 其他分享 >shared_ptr 模拟实现

shared_ptr 模拟实现

时间:2025-01-15 11:22:28浏览次数:1  
标签:count const return other shared ptr 模拟

#include <iostream>
#include <atomic>

template <typename T>
class shared_ptr {
private:
    T* ptr; // 指向管理的对象
    std::atomic<int>* count; // 引用计数

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

public:
    // 构造函数
    explicit shared_ptr(T* p = nullptr) : ptr(p), count(new std::atomic<int>(1)) {
        if (ptr == nullptr) {
            *count = 0;
        }
    }

    // 拷贝构造函数
    shared_ptr(const shared_ptr& other) : ptr(other.ptr), count(other.count) {
        if (ptr) {
            ++(*count);
        }
    }

    // 赋值运算符
    shared_ptr& operator=(const shared_ptr& other) {
        if (this != &other) {
            release();
            ptr = other.ptr;
            count = other.count;
            if (ptr) {
                ++(*count);
            }
        }
        return *this;
    }

    // 析构函数
    ~shared_ptr() {
        release();
    }

    // 重载解引用运算符
    T& operator*() const { return *ptr; }

    // 重载箭头运算符
    T* operator->() const { return ptr; }

    // 获取原始指针
    T* get() const { return ptr; }

    // 重置指针
    void reset(T* p = nullptr) {
        if (p != ptr) {
            release();
            ptr = p;
            count = new std::atomic<int>(1);
            if (ptr == nullptr) {
                *count = 0;
            }
        }
    }

    // 获取引用计数
    long use_count() const { return *count; }
};

// 测试代码
int main() {
    shared_ptr<int> sp1(new int(10));
    std::cout << "sp1 use count: " << sp1.use_count() << std::endl; // 输出: 1

    {
        shared_ptr<int> sp2 = sp1;
        std::cout << "sp1 use count: " << sp1.use_count() << std::endl; // 输出: 2
        std::cout << "sp2 use count: " << sp2.use_count() << std::endl; // 输出: 2
    }

    std::cout << "sp1 use count: " << sp1.use_count() << std::endl; // 输出: 1

    return 0;
}

标签:count,const,return,other,shared,ptr,模拟
From: https://www.cnblogs.com/chhblogs/p/18672655

相关文章

  • 模拟配送公司更新配送单状态
    模拟配送公司更新配送单状态调试工具接口应在服务器端调用,详细说明参见服务端API。接口说明接口英文名mockUpdateOrder功能描述该接口用于模拟配送公司更新配送单状态,该接口只用于沙盒环境,即订单并没有真实流转到运力方.调用方式HTTPS调用POSThttps://api.weixin......
  • 模拟更新配送单状态
    模拟更新配送单状态调试工具接口应在服务器端调用,详细说明参见服务端API。接口说明接口英文名realMockUpdateOrder功能描述该接口用于模拟配送公司更新配送单状态,可进行测试账户下的单,将请求转发到运力测试环境。注意事项该接口只能用于测试,请求会转发到运力测试环......
  • ryujin 1.2.78下载(龙神模拟器),配置19.0的key和对应固件,解决amiibo API错误(需要翻墙vpn)
    1.下载不废话Release1.2.78·Ryubing/Ryujinx·GitHub,找对应的版本下载下载后解压得到publish文件夹,打开里面的Ryujinx.exe,会报错,别管先挂着,接着看步骤22.配置switch的key和固件推荐(不用vpn):下面步骤2.1和2.2 key和固件的下载要使用vpn,你可以直接用夸克打开下面......
  • 【模拟电子技术】06-双极晶体管的结构与放大原理
    【模拟电子技术】06-双极晶体管的结构与放大原理图(b)中我们可以看到三个区的分类,发射区之所以为发射区是因为掺杂浓度高,才能发射电子出去。而集电区掺杂浓度低,就好比我们想让一个房间当作仓库,那么它的空间肯定要大,里面原本不能是放了很多东西。下图NPN晶体管中发射结正偏,集电极......
  • JSP辽宁省公务员考试模拟网站5e5k3(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、选题背景与意义随着信息技术的不......
  • 1.14 CW 模拟赛 赛时记录
    前言时间很短,注意管理,策略不变读题\(\rm{T1}\)需要找性质,可能不太会,但是要冲一下\(\rm{T2}\)困难串串,不知道能打多少\(\rm{T3}\)数位\(\rm{dp}\),日了\(\rm{T4}\)蒸蒸日上!困难大概是前面的没法马上切就丢掉,然后能拿的都拿,数位\(\rm{dp}\)不擅长,......
  • 2025省选模拟5
    2025省选模拟5这场比较简单,T1T2赛后都是没调打完就过了。既然改完了,而且现在也不想写啥题那就还是补下题解吧。T1枇杷树操作\(m\le300\),每次操作构成一颗新树。具体:用边权为\(w\)的边连接编号为\(x\)的树中的\(u\)号节点,编号为\(y\)的树中的\(v\)号节点。询问......
  • uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款
    uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝扫码支付/收付款等功能,界面漂亮颜值高,视频商城小工具等,蚂蚁森林种树养鸡农场偷菜样样齐用于视频,商城,直播,聊天等sumer-alipay介绍uniapp精仿支付宝UI界面,首页/理财/消息/生活/口碑/我的,还有模拟支付宝......
  • ESP32模拟IIC,0.96英寸OLED(四针),改编自江科大/江协。
    #喜欢的宝子可以copy。#本文采用ArduinoIDE开发,用到了多文件形式。点击这里可以创建文件。下面直接分享代码和效果图。效果图0.96OLED.ino #include"OLED.h"voidsetup(){OLED_Init();OLED_ShowString(1,1,"sugkug");}intcnt=0;voidloop()......
  • 原milvdb模拟无法启动只剩下volumes目录的恢复
    环境:OS:Centos7milvus:2.4.61.停掉原有的milvus确保原有的milvusdb里有数据,方便恢复的时候验证[root@host135milvus]#dockercomposedownWARN[0000]/home/middle/milvus/docker-compose.yml:`version`isobsolete[+]Running5/5?Containerattu......