C++ | 深拷贝和浅拷贝

news2024/12/26 13:11:29

C++ 深拷贝和浅拷贝

当类的函数成员存在__指针成员__时会产生深拷贝和浅拷贝和问题。

在进行对象拷贝时会使用默认拷贝构造函数,默认进行浅拷贝,即只会拷贝指针的值,新拷贝的指针与原来的指针指向同一内存;

浅拷贝带来的问题是,调用析构函数时,会导致堆内存被多次释放,因为这些指针指向的是同一份内存。

深拷贝会对指针指向的内存也进行拷贝,解决了指针悬挂的问题。

关于类对象拷贝的情况,需要注意:

  • 函数的参数为对象,实参传递给形参的时候,或函数返回值为一个对象,函数内对象传递给返回值时,系统均通过拷贝构造函数实现。
  • 浅拷贝带来的隐患是,多次释放指向同一块堆内存的不同指针时,会造成内存多次释放的问题。可以使用智能指针 std::shared_ptr 解决这个问题。

Example

#include <iostream>
using namespace std;

class Randy {
 private:
  int age;
  char *id;

 public:
  Randy();
  ~Randy();
};

Randy::Randy() { id = new char(10); }
Randy::~Randy() {
  delete id;
  id = nullptr;
}

int main() {
  {
    Randy q1;
    Randy q2(q1);
  }

  return 0;
}

运行该程序:

(base) qiancj@SanJieJiYuan:~/codes/test$ ./randy 
free(): double free detected in tcache 2
Aborted (core dumped)

增加深拷贝 拷贝构造函数

#include <iostream>
#include <cstring>
using namespace std;

class Randy {
 private:
  int age;
  char *id;

 public:
  Randy();
  ~Randy();
  Randy(const Randy &randy);//拷贝构造函数,const防止对象被改变
};

Randy::Randy() { 
    id = new char(13);
    cout << "Randy ctor" << endl;}
Randy::~Randy() {
  cout << "~Randy : delete id " << id << endl;
  delete id;
  id = nullptr;
}

Randy::Randy(const Randy &randy)
{
    age = randy.age;
	id = new char(13);
            // 内存拷贝
	memcpy(id, randy.id, strlen(randy.id));
	cout << "deep copy Randy" << endl;
}

int main() {
  {
    Randy q1;
    Randy q2(q1);
  }

  return 0;
}

运行结果:

(base) qiancj@SanJieJiYuan:~/codes/test$ ./randy 
Randy ctor
deep copy Randy
~Randy : delete id 
~Randy : delete id 

欢迎关注公众号【三戒纪元】

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

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

相关文章

stm32裸机开发下利用MultiTimer多任务时间片询

stm32裸机开发下利用MultiTimer多任务时间片询 &#x1f4cc;MultiTimerGithub地址&#xff1a;https://github.com/0x1abin/MultiTimer ✨这是一个类似Arduino平台上的Ticker库&#xff0c;如需阅读懂源码&#xff0c;起码需要有链表知识的储备&#xff0c;如果仅仅只是拿来使…

docker学习笔记(二)

目录 启动Docker ​编辑 建立 Docker 用户 ​编辑 测试 Docker 是否正常工作 卸载Docker Docker镜像加速器配置 配置镜像 检查加速器是否生效 如何在Linux中的.json文件下保存并退出 如果我是使用vi操作进来的&#xff0c;我该如何保存并退出呢&#xff1f; 如何在Li…

3 步集成 Terraform + 极狐GitLab CI ,实现基础设施自动化管理

本文来自&#xff1a;极狐GitLab 开发者社区 作者&#xff1a;KaliArch 利用极狐GitLab CI 实现基础设施编排自动化后&#xff0c;用户就可以使用极狐GitLab 进行基础设施管理&#xff1a;提交基础设施变更后&#xff0c;会触发 MR 进行极狐GitLab CI 流水线执行&#xff0c;从…

电视盒子什么牌子好?数码小编分享2023热销电视盒子排行榜

整理私信的时候有朋友希望我能分享电视盒子排行榜&#xff0c;对不了解电视盒子什么牌子好的朋友们来说&#xff0c;选购电视盒子时很容易踩雷&#xff0c;因此我根据各大电商平台的销量数据整理了最新热销电视盒子排行榜&#xff0c;对电视盒子感兴趣的朋友们可以了解一下。 ●…

时序预测 | Python实现AR、ARMA、ARIMA时间序列预测

时序预测 | MATLAB实现VAR和GARCH时间序列预测 目录 时序预测 | MATLAB实现VAR和GARCH时间序列预测预测效果基本介绍模型原理程序设计参考资料预测效果 基本介绍 Python实现AR、ARMA、ARIMA时间序列预测 模型原理 AR、ARMA、ARIMA都是常用的时间序列预测方法,它们的主要区别在…

功能优化升级,添加更丰富的刷题练习设置|会员权益、答题后显示数据、切题按钮、进入小组必设昵称、小组统计筛选条件、考试排行榜、优化缓存机制

土著刷题微信小程序v1.14&#xff0c;主要是针对用户在使用期间提的一些优化建议&#xff0c;经过评估后进行优化升级的一次版本&#xff0c;下面将逐条介绍一下这一版的优化点。 01 会员权益页面 通过对用户提出的问题进行归纳总结&#xff0c;部分用户在购买VIP时&#xff0c…

【git】修改作者和提交者信息

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 修改git作者和提交者信息 1. 正文 1.1 前提 1.1.1 作者和提交者 作者就是我们git log看到的信息&#xff0c;如下&#xff1a; 其修改方式参考&…

linux应用编程

项目内容 开发板内部使用c语言调用硬件驱动实现各种测试功能&#xff0c;保存测试结果。 外部程序通过socket接口使用tcp协议与开发板通信进行信息传输&#xff0c; 最后使用python GUI构造一个界面按照测试顺序逐步显示出各个模块的测试结果 测试包括&#xff1a;485-232uart、…

(十四)地理数据库创建——进一步定义数据库②

&#xff08;十四&#xff09;地理数据库创建——进一步定义数据库② 目录&#xff08;接上篇&#xff09; &#xff08;十四&#xff09;地理数据库创建——进一步定义数据库② 4.创建注释类4.1建立注释类4.2产生连接要素注释 5.创建几何网络5.1几何网络概述5.2建立几何网络 6…

亿级大表毫秒关联,荔枝微课基于Apache Doris 统一实时数仓建设实践

本文导读&#xff1a; Apache Doris 助力荔枝微课构建了规范的、计算统一的实时数仓平台&#xff0c;目前 Apache Doris 已经支撑了荔枝微课内部 90% 以上的业务场景&#xff0c;整体可达到毫秒级的查询响应&#xff0c;数据时效性完成 T1 到分钟级的提升&#xff0c;开发效率更…

设备树的相关概念

.dts相当于.c DTS的源码文件 DTC工具相当于gcc编译器 将dts 编译成 dtb dtb相当于bin文件 或可执行文件 编译dtb 文件的方法 在linux内核文件夹中 make imx6ull-alientek-emmc.dtb在执行上述代码之前 要把 imx6ull-alientek-emmc.dtb删除 否则会提示已经存在 dts的结构 层层…

【Python文本处理】基于GPX文件的心率、速度、时间等参数更改

【Python文本处理】基于GPX文件的心率、速度、时间等参数更改 GPX文件本身其实就是坐标、海拔、时间、心率等综合性的xml文件 如图&#xff1a; 海拔&#xff1a;ele 时间&#xff1a;time 心率&#xff1a;heartrate 在不改变坐标和距离的情况下 缩短时间即可提高速度&#…

使用rsync和inotify实时备份CentOS服务器数据(详解)

简介 在日常运维中&#xff0c;确保服务器上的数据安全是至关重要的。数据丢失或损坏可能会导致灾难性后果&#xff0c;因此定期备份数据是一个明智的做法。本文LZ将向您展示如何使用 rsync 和 inotify-tools 工具在 CentOS 系统上设置实时备份&#xff0c;以确保您的数据始终…

Google I/O:谷歌AR看似不紧不慢,实则暗藏玄机

在今天举行的Google I/O大会上&#xff0c;尽管AI是全场最大的关注点&#xff0c;也还是有一系列AR相关技术和应用更新&#xff0c;比如&#xff1a;ARCore进行更新、推出新的Geospatial Creator等等。 ARCore面世已有5年时间&#xff0c;谷歌每年都在持续推动AR技术的发展。相…

Webpack 核心概念

文章目录 Webpack 核心概念概述安装webpack简单使用配置webpack.config.js配置package.json打包 核心概念modeentry 和 outputentry配置说明output配置说明配置单入口配置多入口 loader安装babel、babel-loader、core-js配置.babelrc配置webpack.config.js配置package.json编写…

【Linux】9. 习题①

2022-09-17_Linux环境与版本 1. 命令拓展(了解) linux查看cpu占用的命令是什么&#xff1f; A.top B.netstat C.free D.df 【答案解析】A 2022-09-24_Linux环境与版本 2. 命令拓展(了解) 以下哪个命令输出Linux内核的版本信息&#xff1a; A.uname -r B.vmstat C.sar D.sta…

wms仓库管理对企业的重要性

一、什么是wms仓库管理&#xff1f; WMS是仓库管理系统的缩写&#xff0c;它提供了一个可视化、智能化的平台&#xff0c;帮助公司进行仓库作业的管理和优化。WMS系统可以支持各种类型的仓库&#xff0c;包括零件、分销、批发、跨境电商等等&#xff0c;并提供多种功能&#xf…

如何查找下载外文文献,超强外文文献检索网站排名

英文文献哪里找&#xff0c;下面小编给大家推荐几个超强英文文献下载网站&#xff0c;推荐排名如下&#xff1a; 第4名&#xff1a;sci-hub 这个网站很多科研人都知道&#xff0c;优点是可以免费下载英文文献&#xff0c;缺点是网站不太稳定经常换域名&#xff0c;而且需要你明…

Zoho Desk获G2“2023年优秀软件”称号

备受瞩目的G2年度优秀软件评选结果终于在近期公布了。该奖项旨在表彰过去一年&#xff0c;在软件行业有突出亮点的厂商和产品。在今年的评选中&#xff0c;除了坚持过往满意度、市场占有率等评选维度&#xff0c;额外新增了英国、法国及德国三个地区的产品名单&#xff0c;还增…

5年测试被裁,去面试差点被问哭了······

我的个人背景非常简单&#xff0c;也可以说丝毫没有亮点。 学历普通&#xff0c;计算机专业二本毕业&#xff0c;毕业后出来就一直在一家小公司&#xff0c;岁月如梭细&#xff0c;算了下至今从事软件测试已经5年了&#xff0c;也点点点了五年&#xff0c;每天都是重复的工作&…