深浅拷贝以及解决浅拷贝(以string浅拷贝为例)

news2024/9/22 1:09:55

一、什么是浅拷贝

        在类和对象的时候,其中编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。

默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝

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

下面代码+图解释一下:

#include <iostream>

using namespace std;

namespace HK
{
	class string
	{
	public:
		string(const char* str = "")
		{
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		}


		~string()
		{
			if (_str)
			{
				delete[] _str;
				_str = nullptr;
			}
		}


	private:
		char* _str;
	};



}

int main()
{

	HK::string s1("hello");

	HK::string s2(s1);

	return 0;
}

上面代码中,在我自己的命名空间里面,string 类里面显示写了构造和析构,拷贝构造和赋值都没写,默认生成的对内置类型完成值拷贝,这里的 char* 就是内置类型。(int char short 等等常见的类型以及指针都是内置类型)

那么浅拷贝是什么样,如下图:

注意看,s2 拷贝 s1 地址都是一样的,析构的时候,s2 析构之后有没有发现 s1 的也被析构了?

因为 s2 和 s1 指向同一地址,如下图:

 

所以析构的时候,也会影响另一个。

那么怎么解决?

        可以采用深拷贝解决浅拷贝问题,即:每个对象都有一份独立的资源,不要和其他对象共享。

二、什么是深拷贝

        深拷贝∶给每个对象独立分配资源,保证多个对象之间不会因共享资源而造成多次释放造成程序奔溃问题。

下面代码+图解释:

#include <iostream>

using namespace std;

namespace HK
{
	class string
	{
	public:
		string(const char* str = "")
		{
			_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;
	};
}

int main()
{

	HK::string s1("hello");

	HK::string s2(s1);

	HK::string s3("world");
	
	HK::string s4 = s3;

	return 0;
}

上面代码中,我显示写了拷贝和赋值,实现了深拷贝, 那么现在怎么样?如下:

 注意看上面的调试窗口, s2 拷贝之后的地址和 s1 是不一样的,s3 赋值给 s4,s4 和 s3 地址也是不一样的,下面截图出来,如下:

以上就是深浅拷贝。

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

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

相关文章

第三十五章 Unity人形动画(下)

本章内容主要就是动画数据的独立文件使用方式。有了独立的动画文件&#xff0c;我们就可以将其应用到其他模型上面了。最简单的方式就是&#xff0c;我们可以给其他模型编辑动画控制器的时候&#xff0c;使用这些动画文件。Unity则给我们提供了更加高级的共享方式&#xff0c;就…

【iOS KVO(下) KVO的内部结构和源码】

前言 学习KVO的过程&#xff0c;我分为了KVO的实现过程分析和内部结构的学习&#xff0c;学习了实现过程&#xff0c;接下来看KVO是通过何种内部结构实现如此通知&#x1f4e2;和监听。 1 KVO的存储结构 KVO的实现过程离不开合理的存储结构&#xff0c;用到了如下几个类 GS…

Linux + 香橙派 + V4L2 + http 实现远程监控摄像头在网页端显示

项目场景&#xff1a; 项目需求&#xff0c;需要做一个基于边缘端的人脸识别远程监控摄像头并在网页前端展示 &#xff0c;这里采用国产香橙派作为边缘计算终端&#xff0c;安装ubuntu系统&#xff0c;系统中采用v4l2接口对摄像头进行获取&#xff0c;当客户端通过网页进行请求…

oracle 数据库创建表空间、用户、数据库实例、授权、数据导入

在安装完oracle 数据库后默认会创建一个orcl的数据库实例。除了这种方式外还可以通过别的方式创建数据库 一般导入数据通过以下五个步骤 创建导入的数据库实例&#xff0c;已有的话可以忽略创建表空间 2.1 创建临时表空间 2.2 创建数据表空间创建用户给用户授权导入数据库数据…

Camtasia 2023新功能添加了新的视觉效果、滤镜和其他重大改进

总部位于密歇根州的 TechSmith 推出了Camtasia 2023&#xff0c;这是其适用于 Mac 和 Windows 的专业屏幕录制和视频编辑工具的重要新版本。 2023 版本侧重于两个特定领域&#xff1a;提供增强的视觉效果和实现各种用户功能请求。 Camtasia 2023 的亮点包括能够在截屏视频中实…

基于Vue的个人网站的设计与实现

统是基于面向对象编程的web应用程序。主要实现的功能有前台的在线留言、音乐播放、下载、收藏、用户注册和后台的背景音乐管理、相册信息管理、网站新闻管理、留言管理等功能。 设计开发一个更能满足网民需求的交流载体&#xff0c;使大家在网上可以提供学习交流分享的平台&…

【Linux】Linux下安装Mysql(图文解说详细版)

文章目录 前言第一步&#xff0c;进到opt文件夹下面&#xff0c;为什么&#xff1f;因为opt文件夹相当于Windows下的D://software第二步&#xff0c;用yum安装第三步&#xff0c;设置mysql的相关配置第四步&#xff0c;设置远程连接。第五步&#xff0c;更改mysql的语言第六步&…

聚观早报|拼多多回应总部迁爱尔兰;微软宣布全面开放聊天机器人

今日要闻&#xff1a;拼多多回应总部迁至爱尔兰&#xff1b;京东60亿元在京建4000套员工房&#xff1b;微软宣布全面开放必应聊天机器人&#xff1b;一加首款可折叠手机将于8月推出&#xff1b;TikTok推出针对出版商的广告产品 拼多多回应总部迁至爱尔兰 5 月 4 日消息&#x…

服务远程调用、ribbon负载均衡、nacos注册中心

1.服务拆分和远程调用 任何分布式架构都离不开服务的拆分&#xff0c;微服务也是一样。 1.1.服务拆分原则 这里我总结了微服务拆分时的几个原则&#xff1a; 不同微服务&#xff0c;不要重复开发相同业务微服务数据独立&#xff0c;不要访问其它微服务的数据库微服务可以将…

Nacos原理(注册中心和配置中心)

服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务&#xff0c;原则上都应存在或者支持多个提供者&#xff0c;这是由微服务的分布式属性决定的。更进一步&#xff0c;为了支持弹性扩缩容特性&#xff0c;一个微服务的提供者的数量和分布往往是动态变化…

【面试系列】如何保证接口的幂等性

为什么需要实现幂等性 在接口调用时一般情况下都能正常返回信息不会重复提交&#xff0c;不过在遇见以下情况时可以就会出现问题&#xff0c;如&#xff1a; 前端重复提交表单&#xff1a;在填写一些表格时候&#xff0c;用户填写完成提交&#xff0c;很多时候会因网络波动没…

C++之编译链接

目录 线程基础静态链接静态链接装载与动态链接库与运行库 关于隔离&#xff1a; 物理地址是实在存在的虚拟地址是虚拟的&#xff0c;并不存在&#xff0c;每个进程都有自己独立的虚拟空间&#xff0c;而且每个进程只能访问自己的地址空间&#xff0c;这样就有效地做到了进程的…

字符设备驱动开发

1、字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节 流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、IIC、SPI&#xff0c; LCD 等等都是字符设备&#xff0c…

不断积累,步步高升:记录我的Python学习历程-python中f-string介绍

最近在看python基础的时候&#xff0c;又发现一个之前没怎么掌握的字符串格式化的小技巧&#xff0c;f-string f-string 格式化 f-string是Python3.6引入的一种字符串格式化方式&#xff0c;它提供了一种简洁、直观的方式来将变量值嵌入到字符串中。在 f-string 中&#xff0c;…

2022 Hubei Provincial Collegiate Programming Contest B. Potion(easy version)

题目链接 Output For each testcase, if Twilight Sparkle couldn’t make the specific mixture, print a single integer: −1. Otherwise, print the minimum number of operation 1 to do that. Example input 3 3 5 1 1 2 6 1 1 5 7 1 1 output 4 3 -1 题目大意 题目保证…

顺序表---(数据结构的开始)

目录 前言&#xff1a; 1.线性表的性质 2.静态数组or动态数组 2.1静态数组 2.2动态数组 3.结构体的创建 4*接口函数的详细讲解 4.1初始化结构体 4.2尾插 4.3打印数据 4.4用完后销毁创建的堆空间 4.5 尾删 4.6头插 4.7头删 4.8查找 4.9任意位置插入 4.10任意位…

正则表达式规则

元字符&#xff1a; 正则表达式主要依赖于元字符。 元字符不代表他们本身的字面意思&#xff0c;他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思。以下是一些元字符的介绍&#xff1a; 运算符优先级&#xff1a; 正则表达式从左到右进行计算&#xff0c;…

idea一些不常见但是非常有用的sql

1.这个功能适合生产环境遇到故障&#xff0c;然后本地&#xff0c;但是前提是jvm配置了如下参数&#xff0c;还有一个就是要保证线上代码和本地的一致&#xff0c;这样就可以本地调式远程代码 在linux 运行 java -agentlib:jdwptransportdt_socket,servery,suspendn,address500…

牛客 BM19 寻找峰值

描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于 2.假设 nums[-1] nums[n] -∞ 3.对于所有…

中台产品经理01:中台落地工具MSS模型

众所周知&#xff0c;每家企业的内部经营管理都是大相径庭的&#xff0c;就算相同行业的两家企业其内部也会有显著的特殊性&#xff0c;因此企业对于自身中台的建设需求也一定是不同的&#xff0c;可以说中台建设必须是为企业量身定制的。 而在每家企业的中台建设中&#xff0…