浅拷贝和深拷贝

浅拷贝:

定义:浅拷贝(Shallow Copy)是一种简单的对象复制方式,将一个对象的数据成员直接复制给另一个对象(通常是通过默认的复制构造函数或赋值运算符实现),这些数据成员可以是基本类型或指向其他对象或资源的指针。具体地说,浅拷贝只是复制指针的值,而不是复制所指向的内存区域。

因此,如果被浅拷贝的对象存在一个或多个指针成员,则会导致多个对象共享同一块内存区域。当其中任何一个对象析构时,该指针将被 delete 解除绑定的内存区域,从而导致其他引用的该内存区域变得无效,从而产生不可预期的行为(如悬挂指针、内存泄漏等)。

=》缺点总结:

1.多次析构(浅拷贝n次就析构n+1次)

解决方法:增加一个引用计数,每个对象析构时,--引用计数,最后一个析构的对象释放空间

2.一个对象修改影响另一个对象

解决方法:写时拷贝(本质,延迟拷贝:谁去写,谁做深拷贝)

没人写不就赚了么

浅拷贝示例:

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

class mystring
{
public:

	//全缺省构造函数
	mystring(const char* str = "")//""是常量字符串,常量字符串默认自带\0
		//受声明顺序的影响
		/* :_size(strlen(str))
		,_capacity(_size)
		,_str(new char[_capacity+1])*/
	{
		//不受声明顺序的影响
		_size = strlen(str);
		_capacity = _size;
		_str = new char[_capacity + 1];

		strcpy(_str, str);
	}

	//析构函数
	~mystring()
	{
		delete[] _str;
		_str = nullptr;
		_size = _capacity = 0;
	}


private:
	size_t _size;
	size_t _capacity;
	char* _str;
};



//拷贝构造
int main()
{
	mystring s1("hello world");
	mystring s2(s1);
	return 0;
}

文字说明: 

s2析构结束后,s1析构s2刚销毁的空间。故会发生警告

深拷贝:

定义:深拷贝(Deep Copy)是一种对象复制方式,将一个对象或资源以及其指向的某些对象或资源一起复制给另一个对象。具体地说,深拷贝会为新对象重新分配内存空间,并将被复制对象的数据成员递归地复制到新对象中。

因此,如果被深拷贝的对象存在指针等非基本类型的成员变量,那么深拷贝会额外申请一块与原对象所使用的内存区域大小相同的内存,将其中的数据递归地复制到新对象中,并返回指向该内存区域的指针。

示例:

#pragma once
#include <iostream>
#include <assert.h>
using namespace std;

class mystring
{
public:

    // 全缺省构造函数
    mystring(const char* str = "")
        : _size(strlen(str)), _capacity(_size), _str(new char[_capacity + 1])
    {
        strcpy(_str, str);
    }

    // 拷贝构造函数
    mystring(const mystring& str)
        : _size(str._size), _capacity(str._capacity), _str(new char[_capacity + 1])
    {
        strcpy(_str, str._str);
    }

    // 析构函数
    ~mystring()
    {
        delete[] _str;
        _str = nullptr;
        _size = _capacity = 0;
    }


private:
    size_t _size;
    size_t _capacity;
    char* _str;
};

int main()
{
    mystring s1("hello world");
    mystring s2(s1);

    return 0;
}

图解:

文字说明:

在拷贝构造函数中,我们使用深拷贝方式将 _str 字符指针所指向的内存区域递归地复制到新对象中,并确保在新对象销毁时释放所申请的内存空间。这样,当新对象与原对象均被销毁时,它们所使用的内存空间是相互独立的,避免了内存泄漏和悬挂指针等问题

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript:字符串

文章目录 字符串344. 反转字符串reverse() 方法&#xff08;打基础的时候&#xff0c;不要太迷恋库函数&#xff09;代码及思路 541. 反转字符串 IIJavaScript String split() 方法JavaScript Array join() 方法代码分析见注释 剑指 Offer 05. 替换空格思路注意&#xff1a;上面…

网络基础学习:什么是网络与网络发展史

什么是网络与网络发展史 什么是网络&#xff1f;什么是网络发展史&#xff1f;分组交换技术TCP/IP技术Web技术ARPANET&#xff08;1969年&#xff09;Internet&#xff08;1983年&#xff09;万维网&#xff08;1990年&#xff09;移动互联网&#xff08;2007年&#xff09;物联…

KDGK-F断路器机械特性测试仪

一、产品概述 KDGK-F 断路器机械特性测试仪可用于各电压等级的真空、六氟化硫、少油、多油等电力系统高压开关的机械特性参数测试与测量。测量数据稳定&#xff0c;抗干扰性强&#xff0c;可在500KV等级及以下电站做实验&#xff0c;接线方便&#xff0c;操作简单&#xff0c;是…

第14章 项目采购管理

文章目录 采购管理包括如下几个过程14.2 编制采购计划 462编制采购计划的输出1&#xff09;采购管理计划2&#xff09;采购工作说明书3&#xff09;采购文件 14.2.3 工作说明书&#xff08;SOW&#xff09; 14.3 实施采购 47414.3.2 实施采购的方法和技术 476&#xff08;1&…

No.054<软考>《(高项)备考大全》【冲刺8】《软考之 119个工具 (6)》

《软考之 119个工具 &#xff08;6&#xff09;》 99.应急应对策略:100.风险在评估:101.风险审计:102.偏差和趋势分析:103.技术绩效测量:104.自制或外购分析:105.市场调研:106.投标人会议:107.建议书评价技术:108.独立核算:109.广告:110.采购谈判:111.合同变更控制系统:112.采购…

ArduPilot之GPS Glitch问题M8N模块配置

ArduPilot之GPS Glitch问题&M8N模块配置 1. 源由2. 现象3. 视频分析3.1 配置&#xff08;不理想&#xff09;3.2 配置优化3.3 优化配置短时间3D LockGlitch3.4 优化配置长时间3D DGPS Lock3.5 使用尽量多的卫星系统3.5.1 配置一3.5.2 配置二 3.6 同一时间段&#xff08;M8N…

3.3 泰勒公式例题分析

例1 写出函数f(x)带有拉格朗日余项的n阶麦克劳林公式 我的答案&#xff1a; 一、信息 1.f(x)的表达式 2.目标求这个f(x)的n阶麦克劳林公式 二、分析 条件1&#xff1a;告诉我f(x)的表达式为我后续带入公式做准备 条件2&#xff1a;告诉我用什么公式和此次求解的方向 三…

平面设计师都在用的设计素材网站,免费下载~

很多新手设计师不知道去哪里找高清、免费的设计素材&#xff0c;今天我就给大家推荐5个设计素材网站&#xff0c;免费下载&#xff0c;赶紧收藏起来把&#xff01; 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站&#xff0c;主要是站内素…

普通2本,去过字节外包,到现在年薪25W+的测试开发,我的2年转行心酸经历...

个人简介 我是一个普通二本大学机械专业毕业&#xff0c;17年毕业&#xff0c;19年转行&#xff0c;目前做IT行业的软件测试已经有3年多&#xff0c;职位是高级测试工程师&#xff0c;坐标上海… 我想现在我也有一点资格谈论关于转行这个话题&#xff1b;希望你在决定转行之前…

unity-VRTK-simulator开发学习日记2(抛物线 导包|使用|调用方法)

导包 使用抛物线 1.层级目录下添加抛物线曲线 曲线上面那个是直线 2.将跟踪控制器 给到抛物线的“跟随资源” &#xff08;选择哪只手射出射线&#xff09; 3.激活按键 找到模拟手柄按键 找到simulator的交互的几个按键&#xff08;ButtonOne为例&#xff09; value&#x…

从4k到42k,软件测试工程师的涨薪史,给我看哭了

清明节一过&#xff0c;盲猜大家已经无心上班&#xff0c;在数着日子准备过五一&#xff0c;但一想到银行卡里的余额……瞬间心情就不美丽了。 最近&#xff0c;2023年高校毕业生就业调查显示&#xff0c;本科毕业月平均起薪为5825元。调查一出&#xff0c;便有很多同学表示自己…

第六章 Iptables与Firewalld防火墙

第六章 Iptables与Firewalld防火墙 一、Iptables 1、策略与规则链 &#xff08;1&#xff09;、防火墙策略规则的设置 一种是“通”即放行&#xff0c;另一种是“堵”即阻止。 当防火墙的默认策略为拒绝时&#xff08;堵&#xff09;&#xff0c;就要设置允许规则通&#x…

[论文笔记] In Search of an Understandable Consensus Algorithm (Extended Version)

In Search of an Understandable Consensus Algorithm (Extended Version) 寻找可理解的共识算法 (扩展版) [Extended Paper] [Original Paper] ATC’14 (Original) 摘要 Raft 是一个用于管理复制日志的共识算法. Raft 更易于理解, 且为构建实际的系统提供了更好的基础. Raf…

Redis 基础

0. Redis 基础 如果对 Redis 还不了解的同学可以先看一下这篇 Redis 基础文章 &#xff0c;这里面介绍了 Redis 是什么&#xff0c;以及怎么用 1. Redis 管道 我们通常使用 Redis 的方式是&#xff0c;发送命令&#xff0c;命令排队&#xff0c;Redis 执行&#xff0c;然后返…

基于SpringBoot3从零配置MybatisPlus

基于SpringBoot3从零配置MybatisPlus记录 文章目录 1.环境2.表数据准备3. 配置pom配置yml 配置MapperScan 3.问题总结问题1: Property sqlSessionFactory or sqlSessionTemplate are required问题2&#xff1a;org.apache.ibatis.binding.BindingException: Invalid bound stat…

ETL到底是什么?

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 前段时间和大家聊了一个话题&#xff0c;就是为什么要用构建数据仓库&#xff0c;而不是直连数据源的方式开发报表&#xff1f;通…

vim编辑文件

目录 一、vi和vim &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;相同点 &#xff08;3&#xff09;不同点 二、使用vim打开文件 三、使用vim编辑文件 &#xff08;1&#xff09;vim的四个模式 &#xff08;2&#xff09;命令模式下的编辑命令 删除 复制 …

你最关心的4个零代码问题,ChatGPT 帮你解答了!

作为人工智能&#xff08;AI&#xff09;新型聊天机器人模型 ChatGPT&#xff0c;刚上线5天就突破100万用户&#xff0c;两个多月全球用户量破亿&#xff0c;不愧为业界最炙热的当红炸子鸡。 ChatGPT 是一种语言生成模型&#xff0c;由 OpenAI 开发和训练。它是基于 Transform…

轻松掌握mysql事务的四大特性ACID及实现原理

1、介绍 要实现这四大特性&#xff0c;我们先了解下mysql中的缓冲池和数据页 2、保证原子性和一致性 1、通过undo log保证数据的原子性和一致性 undo log保证了事务的原子性和一致性。 3、保证隔离性 1、并发事务产生时容易产生的隔离性问题 脏读 不可重复读 幻读…

基于电流控制的并网逆变器(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…