0620# 手写部分

#手写shared_ptr

#include <iostream>template <typename T>
class shared_ptr {
private:T* ptr; // 原始指针int* ref_count; // 引用计数public:// 构造函数explicit shared_ptr(T* p = nullptr) : ptr(p), ref_count(new int(1)) {if (ptr == nullptr) {*ref_count = 0;}}// 拷贝构造函数shared_ptr(const shared_ptr<T>& other) : ptr(other.ptr), ref_count(other.ref_count) {if (ptr) {++(*ref_count);}}// 赋值操作符shared_ptr<T>& operator=(const shared_ptr<T>& other) {if (this != &other) {release();ptr = other.ptr;ref_count = other.ref_count;if (ptr) {++(*ref_count);}}return *this;}// 析构函数~shared_ptr() {release();}// 释放资源void release() {if (ptr && --(*ref_count) == 0) {delete ptr;delete ref_count;}}// 重置void reset(T* p = nullptr) {release();ptr = p;ref_count = new int(1);if (ptr == nullptr) {*ref_count = 0;}}// 获取原始指针T* get() const {return ptr;}// 获取引用计数int use_count() const {return *ref_count;}// 重载解引用操作符T& operator*() const {return *ptr;}// 重载箭头操作符T* operator->() const {return ptr;}
};int main() {shared_ptr<int> sp1(new int(10));std::cout << "sp1 use_count: " << sp1.use_count() << std::endl;{shared_ptr<int> sp2 = sp1;std::cout << "sp1 use_count after sp2: " << sp1.use_count() << std::endl;std::cout << "sp2 use_count: " << sp2.use_count() << std::endl;}std::cout << "sp1 use_count after sp2 out of scope: " << sp1.use_count() << std::endl;return 0;
}

输出

sp1 use_count: 1
sp1 use_count after sp2: 2
sp2 use_count: 2
sp1 use_count after sp2 out of scope: 1

构造函数

explicit shared_ptr(T* p = nullptr) : ptr(p), ref_count(new int(1)) {if (ptr == nullptr) {*ref_count = 0;}
}
  • ptr 初始化为传入的指针 p
  • ref_count 初始化为一个新的整数,并设为1(初始引用计数)。
  • 如果 pnullptr,则将引用计数设为0。

拷贝构造函数

shared_ptr(const shared_ptr<T>& other) : ptr(other.ptr), ref_count(other.ref_count) {if (ptr) {++(*ref_count);}
}
  • ptrref_count 拷贝自 other
  • 如果 ptr 非空,则增加引用计数。

赋值操作符

shared_ptr<T>& operator=(const shared_ptr<T>& other) {if (this != &other) {release(); // 释放当前持有的资源ptr = other.ptr;ref_count = other.ref_count;if (ptr) {++(*ref_count);}}return *this;
}
  • 先检查是否自我赋值,如果是则直接返回当前对象。
  • 调用 release() 函数释放当前持有的资源。
  • 拷贝 ptrref_count,并增加引用计数。

析构函数

~shared_ptr() {release(); // 释放资源
}
  • 调用 release() 函数释放资源。

释放资源

void release() {if (ptr && --(*ref_count) == 0) {delete ptr;delete ref_count;}
}
  • 检查 ptr 是否非空,并减少引用计数。
  • 如果引用计数为0,删除对象和引用计数器。

重置

void reset(T* p = nullptr) {release(); // 释放当前持有的资源ptr = p;ref_count = new int(1);if (ptr == nullptr) {*ref_count = 0;}
}
  • 释放当前持有的资源。
  • ptr 设为新的指针 p,并重新初始化引用计数。

获取原始指针

T* get() const {return ptr;
}
  • 返回原始指针 ptr

获取引用计数

int use_count() const {return *ref_count;
}
  • 返回引用计数的值。

运算符重载

T& operator*() const {return *ptr;
}T* operator->() const {return ptr;
}
  • 提供解引用操作符 * 和箭头操作符 ->,使 shared_ptr 能像普通指针一样使用。

 测试代码

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 after sp2: " << sp1.use_count() << std::endl; // 输出2std::cout << "sp2 use_count: " << sp2.use_count() << std::endl; // 输出2}// sp2 离开作用域,引用计数减1std::cout << "sp1 use_count after sp2 out of scope: " << sp1.use_count() << std::endl; // 输出1return 0;
}

这个测试代码展示了 shared_ptr 如何管理引用计数。当 sp2 离开作用域时,它的析构函数被调用,引用计数减1,最终 sp1 的引用计数回到1。

P.S.

#手写weak_ptr

#手写vector

#手写string

#手写线程池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/856719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React路由笔记(函数组件,自用)

配置 npm i react-router-dom基本使用 目录结构 在src中创建page文件夹放置各页面组件&#xff0c;router中放置路由 1、router中配置路由 在/router/index.js中&#xff0c;使用createBrowserRouter配置路由。 import { createBrowserRouter } from "react-router…

Pure Nature 2 : Mountains

3D样式化的自然环境资源 所有东西都配有预制件,随时可以放在现场。 包含URP版本! 此包包含: 植被 -云杉 -松树 -冷杉 -布什 -蘑菇 -草地 草,树枝,蕨类植物,各种… -鲜花 浆果,胡萝卜,雏菊,浓香,薰衣草,羽扇豆,各种… -蘑菇 岩石 -悬崖 -巨石 -岩石和卵石 -山脉 材料…

webp动图转gif

目录 前言 解决过程 遇到问题 获取duration 前言 上一次我们实现了webp转jpg格式&#xff1a; https://blog.csdn.net/weixin_54143563/article/details/139758200 那么对于含动图的webp文件我们如何将其转为gif文件呢&#xff1f; 之所以会出现这个问题&#xff0c;是因…

【python】PyQt5初体验,窗口等组件开发技巧,面向对象方式开发流程实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

哥伦比亚大学突破性的方法- Diffusion Policy:利用Action Diffusion进行视觉运动策略学习

Diffusion Policy&#xff1a;利用Action Diffusion进行视觉运动策略学习 1. 论文概述 这篇论文提出了一种名为Diffusion Policy的新方法&#xff0c;通过将机器人的视觉运动策略表示为条件扩散去噪过程来生成机器人行为。作者在15个不同的机器人操作基准测试任务上对Diffusi…

VR虚拟现实(Virtual Reality)

虚拟现实&#xff08;Virtual Reality&#xff09;是一种通过计算机技术和设备模拟现实世界的环境和体验的技术。它创造了一个虚拟的三维环境&#xff0c;用户可以通过穿戴设备和感应器与该环境进行互动和沉浸。 虚拟现实技术包括以下几个关键组成部分&#xff1a; 头戴设备&a…

【漏洞复现】红帆iOffice.net wssRtSyn接口处存在SQL注入

【产品&&漏洞简述】 红帆iOffice.net从最早满足医院行政办公需求&#xff08;传统OA&#xff09;&#xff0c;到目前融合了卫生主管部门的管理规范和众多行业特色应用&#xff0c;是目前唯一定位于解决医院综合业务管理的软件&#xff0c;是最符合医院行业特点的医院综…

Python网络安全项目开发实战,如何防命令注入

注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python网络安全项目开发实战_防命令注入_编程案例解析实例详解课程教程.pdf 在Python网络安全项目开发中,防止命令注入(Command Injection)是一项…

MyBatis 动态 SQL怎么使用?

引言&#xff1a;在现代的软件开发中&#xff0c;数据库操作是任何应用程序的核心部分之一。而在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;以其简洁的配置和强大的灵活性被广泛应用。动态 SQL 允许开发人员根据不同的条件和场景动态地生成和执行…

ChatGPT 提问攻略:从基础到精通,掌握AI对话的艺术

提示工程&#xff08;Prompt Engineering&#xff09;的核心目标是提高 AI 输出的质量和准确性&#xff0c;让 AI 的输出结果可控&#xff0c;而不是随机的。 成功使用 ChatGPT 的关键在于提示语的质量&#xff1a;清晰、简洁的提示语有助于保持对话的连贯性&#xff0c;而模糊…

【机器学习300问】127、怎么使用词嵌入?

在探讨如何使用词嵌入之前&#xff0c;我们首先需要理解词嵌入模型的基础。之前的文章已提及&#xff0c;词嵌入技术旨在将文本转换为固定长度的向量&#xff0c;从而使计算机能够解析和理解文本内容。可以跳转下面链接去补充阅读哦&#xff01; 【机器学习300问】126、词嵌入…

会声会影2024旗舰版汉化最新安装包下载方法步骤

嗨&#xff0c;亲爱的CSDN的朋友们&#xff01;&#x1f389;今天&#xff0c;我要跟大家分享一款让你的视频编辑体验升级的神器——会声会影2024最新版本&#xff01;✨如果你是一个热衷于创作视频内容的创作者&#xff0c;那么你一定不能错过这个软件。它不仅功能强大&#x…

tqdm软件包讲解

tqdm软件包 tqdm是一个用于在Python中显示进度条的模块&#xff0c;非常适合用于长时间运行的循环和任务&#xff0c;使得用户可以直观地看到任务的进度。以下是对 tqdm 软件包的详细讲解&#xff0c;包括安装、基本使用、进阶用法和常见应用场景。 安装tqdm 安装tqdm可以使…

maven dependencyManagement作用

Maven 的 dependencyManagement 元素是一个非常强大的功能&#xff0c;它允许在一个父 POM&#xff08;Project Object Model&#xff09;文件中统一管理项目中所有子模块依赖的版本和范围。使用 dependencyManagement 可以确保项目中的所有模块使用一致的依赖版本&#xff0c;…

Windows桌面运维----第五天

1、华为路由怎们配置IP、划分vlan、互通&#xff1a; 1、用户模式→系统模式&#xff1b; 2、进入相关端口&#xff0c;配置IP地址&#xff1b; 3、开通相应vlan,设置vlanX、IP地址&#xff1b; 4、绑定相关端口&#xff0c;设置端口类型&#xff1b; 5、电脑设置IP&#…

一款Wordpress网站导航主题,带昼夜切换功能

Wordpress网站导航主题&#xff0c;带昼夜切换功能。 基于wordpress&#xff0c;部署和使用都比较方便。 界面比较简洁大方。后台管理功能也比较全面&#xff0c;值得一试。 这款主题界面、功能都非常简洁。 作者把这款定位为简约导航主题&#xff0c;所以这款wordpress导航…

ubuntu 22.04安装mongodb7

1、环境更新 sudo apt update sudo apt upgrade 要执行curl命令&#xff0c;需先安装此包 sudo apt-get install curl2、生成MongoDB的gpg秘钥和向APT导入MongoDB7.0版软件包的资源链接 curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyri…

uniapp小程序获取右上角胶囊位置信息

文章目录 导文使用uni.getMenuButtonBoundingClientRect();方法实现完整案例 隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 导文 uniapp小程序获取右上角胶囊位置信息 使用uni.getMenuButtonBoundingClientRect();方法实现 <script>const menuButtonInfo uni.getMe…

被神化了的AI

多模态的大模型&#xff0c;已经在图片、文本、音频、视频领域多点开花&#xff0c;“AI取代人类”的声音不绝与耳&#xff0c;似乎AI是万能药&#xff0c;包治百病。所有互联网时代的应用&#xff0c;都可以用AI重做一遍&#xff0c;所有你能用到的难题&#xff0c;你都会想&a…

【python】flask中如何向https服务器传输信息

【背景】 用flask做一个支持流媒体传输的网页,如何将信息post给流媒体服务器呢? 【方法】 简单例子,视图函数这么写: url = "https://yourip/mytext" headers = {Content-Type:application/octet-stream} @app.route(/,methods=["POST"