c++ 深度拷贝和浅拷贝

news2024/11/16 9:52:00

一、简介

由于20年转行之后一直用的是halcon  和c# ,C++就此搁浅,最近开始搞pcl慢慢的又重拾起来,对于深拷贝和浅拷贝我知道是什么原因造成的,也知道如何解决,但是突然被人问得时候又有点蒙蔽,因此做一个简单的总结。

先看浅拷贝和深拷贝的区别:

浅拷贝:进行简单的赋值拷贝运算,地址是一样的

深拷贝:new 出来的,在堆区申请了内存空间

 二、简单剖析

先举一个例子:作为一个足球迷,真心希望梅西能2022 拿下世界杯,对我们这些没有天赋的普通人来说,天赋比努力要重要100000倍(当你真正的努力过你就知道天赋有多么重要)。

class WorldCupChampion
{
public:
    string     country;
    int* years;
    WorldCupChampion();
    WorldCupChampion(std::string  country, int years);
    ~WorldCupChampion();
};
WorldCupChampion::WorldCupChampion()
{
    cout << "默认构造" << endl;
}


WorldCupChampion::WorldCupChampion(string country, int  years)
{

    this->country = country;
    this->years = new int(years);
    cout << "调用有参构造     " << *(this->years) << "     " << this->country << endl;
}
WorldCupChampion::~WorldCupChampion()
{
    cout << "调用析构函数    " << endl;
    if (years != NULL)  // 由于year是new 在堆区的所以我们要在程序结束的时候将其delete掉
    {
        delete  years;
        years = NULL;
    }

}

然后我们在复制一个放到b 里面

void  test()
{
    WorldCupChampion a("阿根廷", 2022);
    cout << *(a.years) << "世界杯冠军是  :   " << a.country << endl;

    WorldCupChampion b(a);
    cout << *(b.years) << "世界杯冠军是  :   " << b.country << endl;

}

此时我们进行编译:ok 

运行:

 我们采用断掉调试,毕竟一切皆地址:

 分析一下:我们在 创建一个对象a,然后赋值b ,将a 的所有的东西都复制给b ,但是,包括new 出来的东西,从上面的测试可以看出,我们现在的拷贝years 的地址是一样的,也就是说a 和b 的指针都指向了同一块内存空间。

 那么当程序退出的时候我们要析构掉,当a 析构的时候已经将2022 这块内存空间已经析构了,那么当b 再次析构的时候 已经没有这块

内存了,导致程序报错。

浅拷贝结论:

浅拷贝带来的问题得本质是析构函数多长释放堆空间

三、深拷贝

为了解决上面的问题:我们自定义了一个拷贝---深拷贝

模式如下:

WorldCupChampion(const  WorldCupChampion& a);

我们需要在这个构造当中重复new 出一片空间来存储year 

WorldCupChampion::WorldCupChampion(string country, int  years)
{

    this->country = country;
    this->years = new int(years);
    cout << "调用有参构造     " << *(this->years) << "     " << this->country << endl;
}

下面我们先看结果:

 

OK,那我们再次使用断点来看看这次他两的地址是不是一样的:

 完整代码:

#if 1
class WorldCupChampion
{
public:
    string     country;
    int* years;
    WorldCupChampion();
    WorldCupChampion(std::string  country, int years);
    WorldCupChampion(const  WorldCupChampion& a);
    ~WorldCupChampion();
};
WorldCupChampion::WorldCupChampion()
{
    cout << "默认构造" << endl;
}

WorldCupChampion::WorldCupChampion(const  WorldCupChampion& a)
{
    cout << "深度拷贝" << endl;
    this->country = a.country;
    this->years = new int(*a.years);
}
WorldCupChampion::WorldCupChampion(string country, int  years)
{

    this->country = country;
    this->years = new int(years);
    cout << "调用有参构造     " << *(this->years) << "     " << this->country << endl;
}
WorldCupChampion::~WorldCupChampion()
{
    cout << "调用析构函数    " << endl;
    if (years != NULL)  // 由于year是new 在堆区的所以我们要在程序结束的时候将其delete掉
    {
        delete  years;
        years = NULL;
    }

}
void  test()
{
    WorldCupChampion a("阿根廷", 2022);
    cout << *(a.years) << "世界杯冠军是  :   " << a.country << endl;

    WorldCupChampion b(a);
    cout << *(b.years) << "世界杯冠军是  :   " << b.country << endl;

}
int main()
{
    test();
    return 0;
}
#endif

结论: 

使用才会精进,一旦不使用,最简单的问题也会被遗忘 

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

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

相关文章

MCE 天然化合物相关库更新

随着现代化合物分离和鉴定技术的不断提高&#xff0c;以及人们对自然界生物多样性的持续研究&#xff0c;越来越多的天然产物被用于新药研究开发。据统计&#xff0c;截至 2013 年&#xff0c;有 547 个天然产物及天然产物衍生物被 FDA 批准上市&#xff0c;占所有 FDA 批准上市…

高通骁龙处理器天梯排行榜2022 骁龙处理器发布时间排行

骁龙处理器天梯图2022最新10月更新榜单 1、高通骁龙8 Gen1 2、高通骁龙8 Gen1 3、高通骁龙888 Plus 4、高通骁龙888 我用的手机就是活动时7.5折抢购的 点击开抢 http://shouji.adiannao.cn/7 1、工艺&#xff1a;搭载最新一代5nm制作工艺&#xff0c;为用户带来最强的处理器性能…

[附源码]Python计算机毕业设计大学生兼职系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

STM32中的独立看门狗和窗口看门狗

独立看门狗和窗口看门狗有什么区别&#xff1f;一、前言二、独立看门狗三、窗口看门狗四、结语一、前言 在早期的MCU中是没有看门狗这种东西的&#xff0c;所以产品就很容易出现死机&#xff0c;跑飞的情况。为了避免这种情况的出现&#xff0c;后期的MCU都集成了看门狗的功能…

CI/CD Jenkins容器化安装部署

环境准备 docker安装 jenkins镜像安装 CI/CD CI:持续集成 CD:连续交付 环境准备 下载前推荐先看下Jenkins硬件和软件要求部分 Jenkins官方文档 Jenkins下载 虚拟机 docker 对配置的要求 CentOS安装可跳转 VMware安装CentOS CentOS 7.8 // 查看CentOS版本命令 cat /etc…

牛客网语法篇练习循环控制(一)

1.2023年就要来到了&#xff0c;KiKi要对他的n位好朋友说n遍”Happy new year!Good luck!”的祝福语。 n int(input()) for i in range(n):print(Happy new year!Good luck!) 2.任意输入一个正整数N&#xff0c;统计1~N之间奇数的个数和偶数的个数&#xff0c;并输出。 num …

【网页设计】基于HTML在线商城购物项目设计与实现-----电脑商城6页带视频 带报告3000字

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 在线商城购物 | 水果商城 | 商城系统建设 | 多平台移动商城 | H5微商城购物商城项目 | HTML期末大学生网页设计作业 HTML&#xff1a;结构 CSS&#…

java开发者工具IDEA自定义设置主题/字体/字号大小

IDEA自定义设置主题 第一步&#xff1a;点击工具栏上的“File”选项。 第二步&#xff1a;选择“Settings…”选项。 第三步&#xff1a;点击“Appearance & Behavior > Appearance”选项。 第四步&#xff1a;点击右侧"Theme"下拉框&#xff0c;选择自己喜…

动态爬虫管理平台构建与实现_kaic

目 录 第1章 绪论 1.1背景与意义 1.2主题网络爬虫的国内外研究现状 1.2.1主题辨别算法及平台构建 1.2.2主题爬虫系统 1.3本文的研究内容 第二章 主题网络爬虫的体系结构 2.1组成模块 2.1.1基本组成 2.1.2基本流程 2.2主题页面的分布特性 2.2.1 Hub/Authority特性 2.2.2 Linkag…

一篇文章带你搞懂前端Cookie

文章目录一. 前言(一些废话)二. Cookie1. 为什么会有Cookie2. Cookie的特性3. 浏览器Cookie4. 跨站和跨域三. Cookie操作1. 获取Cookie2. 设置Cookie3. 修改Cookie4. 删除Cookie四. Cookie属性1. Cookie属性Domain2. Cookie属性path3. Cookie属性expires4. Cookie属性max-age5.…

大数据_数据中台_数据分层

目录 分层总览 ODS:操作数据层 DIM:维度数据层 DWD:明细数据层 DWS:汇总数据层 ADS:数据应用层 CDM:公共数据层 数据层级调用原则 分层总览 ODS:操作数据层 ODS(Operate Data Store&#xff09;,ODS层数据是数据仓库的第一层数据&#xff0c;是业务数据库的原始数据的复…

Oracle Primavera Unifier uDesigner 资产管理器(Asset Manager )

目录 前言 特点 优势 维护管理 独立或集成 事务管理 资产组合管理 投资组合管理能力 可持续性和能源管理 单一集成设施和资产生命周期管理 移动应用 前言 Oracle Primavera Unifier 为组织提供设施管理的行业最佳实践解决方案。从设计、构建、运行和维护&#xff0…

【深入理解Kotlin协程】Google的工程师们是这样理解Flow的?

Question&#xff1a;why there is a Flow in kotlin? 问这个问题就好比在问为什么那里会有一座山存在&#xff0c;嗯&#xff0c;这貌似是一个哲学问题。当然&#xff0c;对于kotlin中的Flow的理解可能不会上升到这么高的哲学层次&#xff0c;对于Flow相关的Api掌握并使用它…

JavaSE笔记——多态

文章目录前言一、向上转型回顾1.忘掉对象类型二、转机1.方法调用绑定2.产生正确的行为3.可扩展性三、构造器和多态1.构造器调用顺序2.构造器内部多态方法的行为四、协变返回类型总结前言 本文是学习Java编程思想记录的笔记&#xff0c;主要内容介绍在 Java 中多态的概念。 多…

Servlet API(HttpSerrvlet+HttpServletRequest+HttpServletResponse)

目录 &#x1f432; 1. HttpServlet &#x1f432; 2. HttpServletRequest HTTP请求 &#x1f984; 2.1 打印请求信息(创建 ShowRequest 类) &#x1f984; 2.2 获取 GET 请求中的参数(创建 GetParameter 类) &#x1f984; 2.3 获取 POST 请求中的参数(创建 PostParame…

java学习day57(Spring Cloud)Spring Cloud 微服务

主要课程内容 第⼀部分&#xff1a;微服务架构 互联网应用架构演进 微服务架构的体现思想及优缺点 微服务架构的核心概念 第⼆部分&#xff1a;SpringCloud概述 Sping Cloud 是什么 Sping Cloud 解决什么问题 Sping Cloud 架构 第三部分&#xff1a;案例准备 第四部分&#xff…

2022华为杯研究生数学建模竞赛DS数模选题建议

2022华为杯研究生数学建模竞赛DS数模选题建议 开放性&#xff1a;F>E>AD>BC. 难度&#xff1a;AD>BC>EF &#xff08;仅C君个人看法&#xff09; A题 移动场景超分辨定位问题 此题是物理cv类题目&#xff0c;属于比较新颖的超分辨率图像检测类任务&#xff0c…

1、Java的json得到我们想要的数据结构

Java的json得到我们想要的数据结构 第一步&#xff1a;首先我们要知道json就两种数据结构。 &#xff01;&#xff01;&#xff01;第一种数据结构&#xff1a;对象用{ }表示 &#xff01;&#xff01;&#xff01;第二种数据结构&#xff1a;数组用[ ]表示 我们用这个案例来…

在智能家居领域产品中常用芯片

芯片是当前“电子科技设备的灵魂”所在&#xff0c;几乎决定了所有电子设备的综合性能&#xff0c;现如今智能家居带来了全新的使用场景与交互方式&#xff0c;从扫地机器人、智能洗碗机、智能冰箱等智能机器&#xff0c;到智能照明、智能感知、网络通讯、家庭影音等智能系统&a…

H264基础知识入门

之前视频基础&#xff0c;有讲到视频的原始数据YUV&#xff0c;相比RBG&#xff0c;数据确实减少了&#xff0c;但还是一个非常大数据量&#xff0c;会占用很大空间以及在给网络传输带来很大压力。所以必须要对视频进行压缩&#xff0c;减少占用空间。这里主要分享H264编码技术…