当前位置: 首页 > news >正文

【c++】 string类的模拟实现

1.浅拷贝

浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规

就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏

可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。父母给每个孩子都买一份玩具,各自玩各自的就不会有问题了

2.深拷贝

如果一个类中涉及到资源的管理,其拷贝构造函数、赋值运算符重载以及析构函数必须要显式给出。一般情况都是按照深拷贝方式提供

2.1 传统版写法的String类

class String
{
public:String(const char* str = ""){// 构造String类对象时,如果传递nullptr指针,可以认为程序非if (nullptr == str){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}String(const String& s): _str(new char[strlen(s._str) + 1]){strcpy(_str, s._str);}String& operator=(const String& s){if (this != &s){char* pStr = new char[strlen(s._str) + 1];strcpy(pStr, s._str);delete[] _str;_str = pStr;}return *this;}~String(){if (_str){delete[] _str;_str = nullptr;}}
private:char* _str;
};

2.2 现代版写法的String类

class String
{
public:String(const char* str = ""){if (nullptr == str){assert(false);return;}_str = new char[strlen(str) + 1];strcpy(_str, str);}String(const String& s): _str(nullptr){String strTmp(s._str);swap(_str, strTmp._str);}// 对比下和上面的赋值那个实现比较好?String& operator=(String s){swap(_str, s._str);return *this;}/*String& operator=(const String& s){if(this != &s){String strTmp(s);swap(_str, strTmp._str);}return *this;}*/~String(){if (_str){delete[] _str;_str = nullptr;}}
private:char* _str;
};

3.写时拷贝(了解)

写时拷贝就是一种拖延症,是在浅拷贝的基础之上增加了引用计数的方式来实现的。

引用计数:用来记录资源使用者的个数。在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源

相关文章:

【c++】 string类的模拟实现

1.浅拷贝 浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以…...

transformer--transformer模型构建和测试

前面几节进行了各种组件的学习和编码,本节将组件组成transformer,并对其进行测试 EncoderDecoder 编码器解码器构建 使用EnconderDecoder实现编码器-解码器结构 # 使用EncoderDeconder类实现编码器和解码器class EncoderDecoder(nn.Module):def __ini…...

从0到1全流程使用 segment-anything

从0到1全流程使用 segment-anything 一、安装 anaconda 一、下载 anaconda 二、以管理员身份运行安装 1、勾选 Just Me 2、统一安装路径(后续 python 等包也安装至此目录) 3、勾选 add to path 然后安装即可。 三、修改 Anaconda 默认路径及默认缓存路径 Anaconda 默认下…...

Window系统部署Splunk Enterprise并结合内网穿透实现远程访问本地服务

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 本文主要介绍如何简单几步,结合cpolar内网穿透工具实现随时随地在任意浏览器,远程访问在本地…...

Windows服务器:通过nginx反向代理配置HTTPS、安装SSL证书

先看下效果: 原来的是 http,配置好后 https 也能用了,并且显示为安全链接。 首先需要 SSL证书 。 SSL 证书是跟域名绑定的,还有有效期。 windows 下双击可以查看相关信息。 下载的证书是分 Apache、IIS、Tomcat 和 Nginx 的。 我…...

LeetCode67 二进制求和

题目 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 示例 1:输入:a "11", b "1" 输出:"100" 示例 2:输入:a "1010", b "1011" 输出&…...

python | 列表,元组,字符串,集合,字典

列表: 可以容纳任意数目不同类型的元素(支持我们学过的任意数据类型)元素之间有先后顺序用中括号包裹,每个元素用逗号隔开 例如: students [林黛玉,薛宝钗,贾元春,贾探春,史湘云,妙玉,贾迎春,贾惜春,王熙凤,贾巧姐…...

稀疏图带负边的全源最短路Johnson算法

BellmanFord算法 Johnson算法解决的问题 带负权的稀疏图的全源最短路 算法流程 重新设置的每条边的权重都大于或等于0,跑完Djikstra后得到的全源最短路,记得要还原,即:f(u,v) d(u,v) - h[u] h[v] 例题...

oracle基础体系

一、 Oracle数据库服务器 数据库在各个行业都会有使用到;其实,我们平时无论是在与客户沟通或者交流中,所说的Oracle数据库是指Oracle数据库服务器(Oracle Server),它由Oracle实例(Oracle Instan…...

k8s运维问题整理

1.宕机或异常重启导致etcd启动失败 服务器非正常关机(意外掉电、强制拔电)后 etcd 数据损坏。 查看apiserver日志发现出现报错Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused,2379是etcd的端口,那么a…...

设计模式(一)设计模式分类和六大设计原则

0.设计模式的分类 GoF提出的设计模式总共有23种,根据目的准则分类分为三大类: 创建型模式,共五种:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰模式…...

git的学习与使用(笔记最全)

什么是git Git是一种分布式版本控制系统,每个开发者都可以在自己的机器上拥有一个完整的仓库 特点 断网也可以工作:没网的情况下,不会影响工作。对于未提交到远程库的代码可以随时撤销。可以查看历史提交记录,以及文件内容的修改记…...

windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…...

学习python时一些笔记

1、winr 命令提示符的快捷键 输入cmd进入终端 2、在终端运行桌面上的python文件 cd desktop(桌面) cd是进入该文件夹的意思。 cd .. 回到上一级 运行python时一定要找到文件的所在地 输入python进入,exit()退出%s字符串占位符%d数字占位符%f浮点数占位符input输…...

php基础学习之错误处理(其二)

在实际应用中,开发者当然不希望把自己开发的程序的错误暴露给用户,一方面会动摇客户对己方的信心,另一方面容易被攻击者抓住漏洞实施攻击,同时开发者本身需要及时收集错误,因此需要合理的设置错误显示与记录错误日志 一…...

云计算 2月28号 (linux的磁盘分区)

一 存储管理 主要知识点: 基本分区、逻辑卷LVM、EXT3/4/XFS文件系统、RAID 初识硬盘 机械 HDD 固态 SSD SSD的优势 SSD采用电子存储介质进行数据存储和读取的一种技术,拥有极高的存储性能,被认为是存储技术发展的未来新星。 与传统硬盘相比&#xff0c…...

demo型xss初级靶场

一、环境 XSS Game - Ma Spaghet! | PwnFunction 二、开始闯关 第一关 看看代码 试一下直接写 明显进来了为什么不执行看看官方文档吧 你不执行那我就更改单标签去使用呗 ?somebody<img%20src1%20onerror"alert(1)"> 防御&#xff1a; innerText 第二关…...

【推荐算法系列十八】:DSSM 召回算法

参考 推荐系统中 DSSM 双塔模型汇总&#xff08;二更&#xff09; DSSM 和 YouTubeDNN 都是比较经典的 U2I 模型。 U2I 召回 U2I 召回也就是 User-to-Item 召回&#xff0c;它基于用户的历史行为以及用户的一些个人信息&#xff0c;对系统中的候选物品进行筛选&#xff0c;挑…...

CNAN知识图谱辅助推荐系统

CNAN知识图谱辅助推荐系统 文章介绍了一个基于KG的推荐系统模型&#xff0c;代码也已开源&#xff0c;可以看出主要follow了KGNN-LS 。算法流程大致如下&#xff1a; 1. 算法介绍 算法除去attention机制外&#xff0c;主要的思想在于&#xff1a;user由交互过的item来表示、i…...

大数据经典面试例题

程序员的金三银四求职宝典 随着春天的脚步渐近&#xff0c;对于许多程序员来说&#xff0c;一年中最繁忙、最重要的面试季节也随之而来。金三银四&#xff0c;即三月和四月&#xff0c;被广大程序员视为求职的黄金时期。在这两个月里&#xff0c;各大公司纷纷开放招聘&#xf…...

Unity游戏自动翻译插件XUnity.AutoTranslator:打破语言壁垒的终极解决方案

Unity游戏自动翻译插件XUnity.AutoTranslator&#xff1a;打破语言壁垒的终极解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款功能强大的开源Unity游戏自动翻译插件&…...

AI写论文新选择!4款AI论文生成工具,高效完成毕业论文创作!

实测四款AI论文写作工具 在撰写期刊论文、毕业论文或者职称论文的过程中&#xff0c;许多学者常常会遇到不少困难。人工撰写论文时庞大的文献资料让人感到无从下手&#xff0c;查找相关信息就像是在大海中捞针。同时&#xff0c;论文格式的复杂与严格要求常常让人陷入焦虑之中…...

浙江清洁拖把这样选

随着现代生活节奏的加快和健康家居理念的普及&#xff0c;家庭清洁工具正经历着一场深刻的智能化、便捷化变革。在众多品类中&#xff0c;清洁拖把作为地面清洁的核心工具&#xff0c;其技术演进与产品创新直接关系到清洁效率和用户体验。本文将聚焦行业痛点、技术方案与应用效…...

最强30B模型GLM-4.7-Flash实测:Ollama一键部署,小白也能玩转AI

最强30B模型GLM-4.7-Flash实测&#xff1a;Ollama一键部署&#xff0c;小白也能玩转AI 1. GLM-4.7-Flash模型概述 1.1 模型特点与优势 GLM-4.7-Flash是当前30B参数级别中最具竞争力的混合专家模型&#xff08;MoE&#xff09;。这个规模特别适合需要平衡性能与资源消耗的实际…...

内存对齐,凭空多出来的空间?

今天学习了一下 C 的结构体&#xff08;struct&#xff09;内存&#xff0c;发现这里面的水挺深。如果不了解“内存对齐”&#xff0c;代码很容易就在不知不觉中多占了一堆空间。整理成笔记分享给大家&#xff1a;1. 为什么结构体的大小“不按套路出牌”&#xff1f;先看这个结…...

告别卡顿与花屏:FFmpeg解码H.264/H.265实时流时,你必须处理的丢包与同步问题实战

FFmpeg实战&#xff1a;构建高稳定性的H.264/H.265实时流解码系统 当你在开发一个实时视频监控系统或流媒体播放器时&#xff0c;最令人沮丧的莫过于画面卡顿、花屏甚至崩溃。这些问题往往源于网络传输中的丢包、乱序以及解码器状态管理不当。本文将深入探讨如何利用FFmpeg构建…...

RMBG-1.4开源模型部署:AI净界支持Gradio自定义UI与插件扩展

RMBG-1.4开源模型部署&#xff1a;AI净界支持Gradio自定义UI与插件扩展 1. 项目简介 AI净界是一个基于BriaAI开源RMBG-1.4图像分割模型的智能背景移除工具。这个工具的核心能力是提供"发丝级"精度的自动抠图服务&#xff0c;无论你上传的是复杂的风景照片&#xff…...

Chord在科研视频处理中的应用:实验过程帧级语义标注与行为时序建模

Chord在科研视频处理中的应用&#xff1a;实验过程帧级语义标注与行为时序建模 1. 引言&#xff1a;科研视频分析的挑战与机遇 在科学研究领域&#xff0c;特别是生物学、心理学、医学和工程学等学科中&#xff0c;实验过程视频记录已成为不可或缺的研究手段。研究人员通过视…...

别再手动部署了!用Jenkins Pipeline + K8s + Harbor 实现Spring Boot项目自动化发布(保姆级教程)

从混乱到优雅&#xff1a;基于Jenkins Pipeline的云原生CI/CD实战指南 为什么你的自动化部署流程依然低效&#xff1f; 在技术团队中&#xff0c;我们经常遇到这样的场景&#xff1a;明明已经配置了GitLab代码仓库、搭建了Jenkins构建服务器、部署了Harbor镜像仓库和Kubernetes…...

AMx8x5系列RTC驱动详解:嵌入式低功耗实时时钟集成方案

1. AMx8x5系列RTC驱动深度解析&#xff1a;面向嵌入式系统的高精度实时时钟集成方案AMx8x5并非单一芯片型号&#xff0c;而是一类高度兼容、引脚与寄存器级对齐的超低功耗实时时钟&#xff08;RTC&#xff09;器件家族的统称。该命名规则覆盖了Ambiq Micro&#xff08;原Ambiq …...