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

http://www.lryc.cn/news/310783.html

相关文章:

  • transformer--transformer模型构建和测试
  • 从0到1全流程使用 segment-anything
  • Window系统部署Splunk Enterprise并结合内网穿透实现远程访问本地服务
  • Windows服务器:通过nginx反向代理配置HTTPS、安装SSL证书
  • LeetCode67 二进制求和
  • python | 列表,元组,字符串,集合,字典
  • 稀疏图带负边的全源最短路Johnson算法
  • oracle基础体系
  • k8s运维问题整理
  • 设计模式(一)设计模式分类和六大设计原则
  • git的学习与使用(笔记最全)
  • windows环境下Grafana+loki+promtail入门级部署日志系统,收集Springboot(Slf4j+logback)项目日志
  • 学习python时一些笔记
  • php基础学习之错误处理(其二)
  • 云计算 2月28号 (linux的磁盘分区)
  • demo型xss初级靶场
  • 【推荐算法系列十八】:DSSM 召回算法
  • CNAN知识图谱辅助推荐系统
  • 大数据经典面试例题
  • 软考56-上午题-【数据库】-数据库设计步骤2
  • 抖店入驻费用是多少?新手入驻都有哪些要求?2024费用明细!
  • 2024东南大学553复试真题及笔记
  • 编程笔记 html5cssjs 096 JavaScript 前端开发(完结)
  • 案例介绍:信息抽取技术在汽车销售与分销策略中的应用与实践
  • 几种常用的企业加密文件传输方式,最后一种更佳!
  • 【全志D1-H 哪吒开发板】Debian系统安装调教和点灯指南
  • Redis 8种基本数据类型及常用命令和数据类型的应用场景
  • JAVA内存模型与JVM内存结构
  • 双导师的中国社科院与英国斯特灵大学创新与领导力博士
  • OpenXR 超详细的spec--API初始化介绍