【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,说明该对象时资源的最后一个使用者,将该资源释放;否则就不能释放,因为还有其他对象在使用该资源

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

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

相关文章

NLP_文本特征处理_4(代码示例)

目标 了解文本特征处理的作用. 掌握实现常见的文本特征处理的具体方法. 文本特征处理的作用: 文本特征处理包括为语料添加具有普适性的文本特征, 如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范. 这些特征处理工作能够有效的将重要的文本特征加入…

【C++基础】STL容器面试题分享||上篇

🌈欢迎来到C基础专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C STL 1.请说说 STL 的基本组成部分2.详细的说&…

xss.haozi.me:0x03及04

这里有一个正则所以&#xff08;&#xff09;要用到实体编码 <a href"javascript:alert1">cc</a> 03 04都一样

密码安全:保护你的数据不被入侵的重要性

title: 密码安全&#xff1a;保护你的数据不被入侵的重要性 date: 2024/3/5 17:54:56 updated: 2024/3/5 17:54:56 tags: 密码安全个人隐私保护身份盗窃防护金融损失防范弱密码危害安全密码创建双因素认证 在数字时代&#xff0c;密码安全是保护个人和机构数据的关键。然而&am…

如何做代币分析:以 INJ 币为例

如何做代币分析&#xff1a;以 INJ 币为例 作者&#xff1a; lesleyfootprint.network 编译&#xff1a;cicifootprint.network 数据源&#xff1a;INJ 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作…

Linux——自写一个简易的shell

目录 前言 一、打印提示信息 二、分割字符串 三、替换程序 前言 之前学习了很多进程相关的知识&#xff0c;包括环境变量、进程的创建与退出、进程等待、进程替换。现在可以用所学的作一个小总结&#xff0c;手撕一个shell解释器&#xff0c;大致的思路是先通过环境变量获…

【牛客】SQL140 未完成率较高的50%用户近三个月答卷情况-窗口函数

描述 现有用户信息表user_info&#xff08;uid用户ID&#xff0c;nick_name昵称, achievement成就值, level等级, job职业方向, register_time注册时间&#xff09;&#xff1a; iduidnick_nameachievementleveljobregister_time11001牛客1号32007算法2020-01-01 10:00:00210…

(vue)适合后台管理系统开发的前端框架

(vue)适合后台管理系统开发的前端框架 1、D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/#/index 开源协议&#xff1a;MIT 2、vue-el…

服务器上部署WEb服务方法

部署Web服务在服务器上是一个比较复杂的过程。这不仅仅涉及到配置环境、选择软件和设置端口&#xff0c;更有众多其它因素需要考虑。以下是在服务器上部署WEb服务的步骤&#xff1a; 1. 选择服务器&#xff1a;根据项目规模和预期访问量&#xff0c;选择合适的服务器类型和配置…

Linux 进程间通信

目录 管道 匿名管道&#xff08;pipe&#xff09; 有名管道&#xff08;fifo&#xff09; 小结 共享内存 消息队列 信号量 System V IPC的结构设计 Posix与System V的关系 管道 匿名管道&#xff08;pipe&#xff09; 我们知道&#xff0c;在Linux中通过fork创建的子…

OpenDDS之QosXml库编译(Windows + VS2019)

目录 1、需求背景2、基础环境3、编译xercesc3.1、下载xercesc3.2、编译xercesc 4、编译ACE_XML_Utils4.1、生成XML_Utils解决方案4.2、编译XML_Utils 5、编译QOS_XML_XSC_Handlerd5.1、生成QOS_XML_XSC_Handlerd解决方案5.2、编译QOS_XML_XSC_Handlerd 6、测试例子6.1、生成dum…

抖音小店简洁版运营流程,帮助新手商家快速学习!

大家好&#xff0c;我是电商糖果 一个做了7年电商的90后&#xff0c;从2020年开始做抖音小店&#xff0c;现在已经经营了多家小店。 这篇文章从开店到选品&#xff0c;出体验分&#xff0c;找达人合作&#xff0c;对接厂家等全部给分享出来。 一、准备材料 1. 个体户营业执…

光影交织:汽车穿越隧道的视觉盛宴

在繁忙的城市中&#xff0c;隧道成为了连接两端的重要通道。而对于汽车来说&#xff0c;穿越隧道不仅是一次简单的空间转移&#xff0c;更是一场融合了视觉、技术与安全的独特体验。 当汽车缓缓驶入隧道&#xff0c;外界的光线逐渐减弱&#xff0c;隧道内部的光线开始发挥作用。…

运营微信公众号的四大关键步骤

1. 明确运营目的 首先&#xff0c;我们需要明确运营微信公众号的目的。不同行业和企业可能有不同的目标&#xff0c;但总体来说&#xff0c;都是为了获得相关利益。对于企业来说&#xff0c;建立口碑&#xff0c;树立形象是非常重要的。通过用户的口碑传播&#xff0c;可以提高…

Ubuntu下anaconda迁移到另外的目录

文章目录 前言一、原因二、迁移1.复制到指定迁移目录2. 修改复制后的anaconda3 内容3. 修改对应搭建的每个环境的pip4.修改系统配置文件&#xff0c;使得设置生效 三、实际测试四、总结 前言 好记性不如烂笔头&#xff0c;简单的记录下在ubantu18.04下迁移anaconda的目录 一、…

2024年软考重大改革

中国计算机技术职业资格网 考试日期 考试级别 考试资格名称 5月25日至28日 高级 系统分析师 系统架构设计师 信息系统项目管理师 中级 软件设计师 网络工程师 软件评测师 电子商务设计师 嵌入式系统设计师 数据库系统工程师 信息系统管理工程师 初级 程序员 …

DiffusionMat:Alpha Matting as sequential refinement learning

1.introduction DiffusionMat的基本思想是未知区域的抠图可以逐步改进&#xff0c;并从每一次的迭代的反馈中受益&#xff0c;纠正和细化结果。 2.related works Segdiff、BitDiffusion、DiffusionDet、 3.Approach 通过一种新颖的校正策略将trimap引导转化为精确的alpha m…

2024-简单点-picamera2除了文档还有哪里可以学习实例?

picamera2学习例子 去github的picamera2库&#xff0c;找app和examples目录&#xff0c;然后学习

自动化测试基础——allure下载安装及配置及pytest + allure-pytest插件生成allure企业级测试报告及企业级定制

文章目录 前言一、allure下载二、allure安装三、allure目录介绍四、allure环境变量配置五、pytest allure-pytest插件生成allure企业级测试报告六、allure企业级报告的log定制七、allure企业级报告功能内容定制1.功能左边层级定制2.功能右边优先级定制3.功能右边测试用例描述定…

Qt绘制动态罗盘

介绍&#xff1a;罗盘指针以30角旋转巡逻&#xff0c;扫描航海范围内的点位&#xff0c;并绘制点云。字段信息在表格中显示&#xff0c;该数据都存储在数据库中。选择不同的范围&#xff0c;显示该范围内的点位。 #include "mainwindow.h" #include "ui_mainwi…