C++:string类写时拷贝|引用计数

news2024/9/27 18:29:11


Blog’s 主页: 白乐天_ξ( ✿>◡❛)
🌈 个人Motto:他强任他强,清风拂山冈!
💫 欢迎来到我的学习笔记!

写时拷贝(了解)

参考博客:C++写时拷贝的不同方案(String类)_c++ string 从第三个字节拷贝-CSDN博客

1.1 概念

  • 在此之前,我们就有讲过深浅拷贝的问题
    • 浅拷贝会导致同一块空间析构两次;
    • 一个对象进行修改等变化会影响另一个对象(因为同一个地址同一块空间)
  • 因此我们使用深拷贝解决该问题:先开辟空间后拷贝数据。但是这种方法需要我们没创建一个对象就去深拷贝,可在后面该对象并没有做任何修改操作,那么深拷贝的作用就不大了,而且还浪费了内存空间资源。(深拷贝:每次对对象进行值和空间同时拷贝,但是会使用更多的空间
  • 因此就有了写时拷贝。当对空间进行修改时,检查出来自己以外是否还有其他对象使用此空间。有,自己重新开辟空间进行修改,不去影响其他对象;没有,则表示是自己空间资源独享,直接进行更改。而这里引入引用计数,用于统计有多少对象在使用这块空间资源

1.2 方案1

画板

  • 当创建出一个对象s1,利用s1拷贝构造出一个对象s2,引用技术refCount自动+1,此时值为2。
  • 如果现在要对s2进行自身的修改操作,先判断refCount是否大于1。若大于1,则s2要重新开辟一块空间,然后再进行修改操作,避免影响其他对象。

画板

  • s2重新开辟了一块空间,然后再修改原来的引用计数refCount,使其-1;重新开辟的空间中因为此时只有一个对象,所以引用计数refCount也是1。

总结:此方案的写时拷贝技术是同时开辟两块空间,一块用于存放自身的内容,另一块用于存放引用计数refCount,同时管理两块空间,统计当前使用此空间的对象数,当要修改当前空间的时候,进行引用计数的判断,再决定是否开辟新空间。

class String
{
public:
	//构造函数
	String(char* str="")
		:_str(new char[strlen(str)+1])
		,_refCount(new int(1))
	{
		strcpy(_str, str);
	}
 
 
	//拷贝构造函数
	String(String& s)
	{
		_str = s._str;
		_refCount = s._refCount;
		++(*_refCount);
	}
 
	String& operator=(const String& s)
	{
		if (_str != s._str)
		{
			Release();
 
			_str = s._str;
			_refCount = s._refCount;
			(*_refCount)++;
		}
		return *this;
	}
 
	void Release()
	{
		if (--(*_refCount) == 0)
		{
			cout << "delete" << endl;
			delete[] _str;
			delete _refCount;
		}
	}
 
	~String()
	{
		Release();
	}
 
	void CopyOnWrite()
	{
		if (*_refCount > 1)
		{
			char* tmp = new char[strlen(_str) + 1];
			strcpy(tmp, _str);
			--(*_refCount);
 
			_str = tmp;
			_refCount = new int(1);
		}
	}
 
	char& operator[](size_t pos)
	{
		CopyOnWrite();
		return _str[pos];
	}
 
	char operator[](size_t pos) const
	{
		return _str[pos];
	}
private:
	char* _str;
	int* _refCount;
};

1.3 方案2

  • 开辟两块空间同时进行管理,方案2只开辟一块空间进行写时拷贝操作。

画板

  • 在对对象进行操作时,先检查引用计数的个数,然后再判断是否开辟新的空间,同时修改引用计数的值,防止空间不能释放。
  • 例如:当创建的3个对象s1、s2、s3同时指向一个空间时,再创建一个对象s4,s4的引用计数为1。

画板

再进行s3 = s4操作,此时对应的引用计数和对应的指向都需要进行修改,更改后图形如下:

画板

  • 此时对象s3指向了s4,同时原来的空间的引用计数进行-1操作 ,新指向空间的引用计数进行+1操作,而且不用开辟两块空间。

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

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

相关文章

前台项目启动/打包报错 Error: error:0308010C:digital envelope routines::unsupported

在package.json中修改启动/打包语句 如图&#xff0c;我这里是打包时候报错&#xff0c;就在build里前面加上 set NODE_OPTIONS--openssl-legacy-provider && 再次打包&#xff0c;成功。

了解HTTPS

目录 1.HTTP认识 2.HTTP请求 3.HTTP响应 4.URL 5.HTTP方法 面试题&#xff1a;POST 和 GET区别&#xff1f; 网上关于 GET 与 POST的差别 有待商议 关于请求报头 和 响应报头 6..Host &#xff1a; 7..USer-Agent&#xff08;简称UA&#xff09; 8.状态码 9.HTTPS 是…

使用Charles抓包Android App数据

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 抓包环境准备 1. 下载安装charles charles下载地址&#xff1a;https://www.charlesproxy.com/latest-release/download.do 2. SSL代理设置 3. http代理和…

七段 LED 显示器(7段数码管)

7 段 LED 显示器, 通常简称为 LED 数码管 或 数码管. 通过 菜单--绘制--数字芯片--添加 7 段 LED 显示器 可以引入它. 普通模式 它内部其实就是七盏长条状的 LED 灯, 有的横着放, 有的竖着放. 七个灯用 a b c d e f g 分别表示. 灯的位置从上到下, 从里到外顺时针下来, 如上图…

240925-GAN生成对抗网络

GAN生成对抗网络 GAN&#xff0c;顾名思义&#xff0c;gan……咳咳&#xff0c;就是干仗嘛&#xff08;听子豪兄的课讲说这个名字还真的源于中文这个字&#xff09;&#xff0c;对应的就有两方&#xff0c;放在这里就是有两个网络互相对抗互相学习。类比武林高手切磋&#xff…

iPhone手机备忘录如何克隆到其他手机?

很多苹果用户喜欢使用备忘录记事&#xff0c;它不仅方便用户记录日常事务&#xff0c;还能存储灵感和重要信息。然而&#xff0c;当用户需要更换手机时&#xff0c;尤其是跨系统更换&#xff0c;备忘录内容的迁移便成了一个难题。 为了解决这一问题&#xff0c;用户可以选择使…

亚马逊新手运营如何变优秀?——把简单的事情复杂化!

众所周知&#xff0c;电商运营的基本逻辑看似简单&#xff1a;流量、转化率和利润率的结合等于盈利。然而&#xff0c;这个等式背后隐藏的复杂性常常让新手运营者感到困惑。 他们可能会发现&#xff0c;尽管他们努力增加流量、提高转化率和调整利润率&#xff0c;但仍然无法实…

【可见的点——欧拉函数】

在数论&#xff0c;对正整数n&#xff0c;欧拉函数是小于或等于n的正整数中与n互质的数的数目&#xff08;不包括1&#xff09; 题目 思路 有三个点比较特殊&#xff08;因为一来这三个点一定可见&#xff0c;同时也无法用gcd 1判断&#xff09;&#xff1a;&#xff08;0&am…

自己偷偷玩!(NSFW)无内容审查大模型推荐

大家好&#xff0c;我是画画的小强 今天给大家推荐几个(NSFW)无内容审查的大模型&#xff0c;可以让你部署在本地电脑运行&#xff01; CausalLM-14B CausalLM-14B 是基于阿里通义实验室的大模型 Qwen-14B 加入其他中文数据集训练而来&#xff0c;经过量化和 DPO 算法的重构…

2025台球展,2025河南台球及配套设施展览会3月举办

阳春三月&#xff0c;年度招商季&#xff0c;壹肆柒中国国际台球产业博览会助力全国台球企业拓市场&#xff1b; 2025中国&#xff08;郑州&#xff09;国际台球产业博览会&#xff08;壹肆柒台球展&#xff09; The 2025 China (Zhengzhou) International Billiards Industry…

朋友圈内容折叠全解析:原因与对策

你是否遇到过精心编写的朋友圈动态被微信自动折叠成一行&#xff0c;甚至出现“叠中叠”现象&#xff0c;多条动态被压缩在一起&#xff1f;这种情况被称为“朋友圈折叠”&#xff0c;它影响着信息的曝光率和互动性。为了帮助你更好地管理朋友圈内容&#xff0c;我将为你详细解…

uni-app App版本更新

效果图&#xff1a; 前言 在移动应用开发中&#xff0c;确保用户能够及时更新到最新版本是非常重要的。本文将介绍如何在 uni-app 中实现 App 整包更新功能&#xff0c;并提供相关代码示例以帮助理解。 代码实现 2.1 引入模块 首先&#xff0c;我们需要引入用于处理更新的模块…

阿博图书馆管理:SpringBoot开发实践

第三章 系统分析 通过对系统功能模块分析可以得知&#xff0c;主要是对项目元素组合、分解和更换做出相应的单元&#xff0c;再通过系统模块来规划出一个原则&#xff0c;系统的设计首先是围绕用户需求进行开发设计的&#xff0c;主要是为了能够更好的管理信息和方便用户&#…

AI智能时代:哪款编程工具让你的工作效率翻倍?

引言 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你的工作效率翻倍&#xff1f;是智能的代码编…

MISC - 第七天(练习)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天继续讲解MISC的相关知识点 [BJDCTF2020]just_a_rar 下载之后发现rar压缩包&#xff0c;名称为4位数&#xff0c;使用暴力破解 rar压缩包口令 2016 存放了一张jpg图片 使用StegSolve 工具Flie Format选项卡&#x…

网络编程:掌握TCP Socket和UDP Socket

IP地址&#xff1a; 两台计算机通信&#xff0c;双方都必须有IP地址。 IPV4地址有32位&#xff0c;由四个8位二进制组成&#xff0c;因为不好记所以我们把二进制转化为十进制&#xff0c;比如192.168.0.20&#xff0c;这称为点分十进制。 IPV6有128位&#xff0c;由8个16位的…

Splashtop 自收购 Foxpass 以来新业务增长62%

2024年9月24日 加利福尼亚州库比蒂诺 Splashtop 在简化远程办公解决方案领域处于领先地位&#xff0c;今天宣布继去年收购 Foxpass 之后&#xff0c;新的 Foxpass 业务实现了62%的增长。Splashtop 的 Foxpass Cloud RADIUS 可确保企业 Wi-Fi 网络安全&#xff0c;防止未经授权…

牛羊饲料加工机械成套设备:满足养殖需求

饲料加工机械成套设备在畜牧业中扮演着至关重要的角色&#xff0c;是保障畜禽健康成长和畜牧业发展的重要基础。这些设备通过配料、粉碎、混合等步骤&#xff0c;生产出不同畜禽需求的饲料&#xff0c;为畜牧业的可持续发展提供了有力支持。 饲料加工机械成套设备是牛羊养殖场…

机器学习常用的评价指标原理和代码

最近面试的时候&#xff0c;很多面试官问道了我项目中的一些评价指标的算法和原理&#xff0c;我觉得这确实也是一个很重要的内容&#xff0c;所以趁这个机会综合起来一块复习一下&#xff0c;在刷力扣的时候也不能忘记项目最常用的内容嘛。当然还包括一些深度学习的例如我项目…

OJ在线评测系统 判题机开发 保证Docker容器执行的安全性

实现Docker容器的安全性 我们现在怎么保证使用docker容器执行的安全性&#xff1f; docker只不过实现了系统与系统之间的隔离 真实情况还是需要我们去排查安全问题 毕竟没有绝对的安全 执行超时 占用内存 读文件信息泄露 执行死程序 超时设置 执行容器的时候 增加超时参…