浅拷贝与深度拷贝

深度拷贝与浅拷贝在Java中的应用与区别 本文深入探讨了Java中的浅拷贝与深度拷贝的概念、实现方式以及它们之间的区别。通过实例代码演示了如何在Java中使用克隆接口来实现对象的引用拷贝、浅拷贝和深度拷贝,并解释了每种拷贝方式的适用场景和潜在影响。 阅读详情

注意:默认的拷贝是浅拷贝

 

浅拷贝(只是机械的拷贝)

public:
	CopyConstructor()
	{
		p = new int(100);
	}
	/*析构函数*/
	~CopyConstructor()
	{
		assert(p != NULL);
		delete p;
	}
private:
	int *p;
	int width;
	int height;
};
int main()
{
	{
		CopyConstructor CopyConstructor1;
		CopyConstructor CopyConstructor2(CopyConstructor1);	
	}/*这里加括号的原因是为了上面两条语句的执行范围只是在代码快中,在这个代码块结束时就要释放两个对象,才能调用其析构函数,否则没有
	 括号时,上面两句的创建的对象存在范围为整个main函数,只有当整个main函数执行结束才能调用析构函数,也就看不到问题所在,同时也就无法释放分配的内存*/
	system("pause");
	return 0;
}


分析:


 

由于在执行

CopyConstructor CopyConstructor1;时

默认构造函数中为指针*p分配内存空间,然后在执行

CopyConstructor CopyConstructor2(CopyConstructor1);时会调用编译器创建的拷贝构造函数,在该拷贝构造函数中,会产生一个临时变量CopyConstructor2.p来接收CopyConstructor1.p指向的地址空间(这里只是机械的拷贝),所以此时就会有两个指针变量指向堆中的同一片内存,当释放两个对象是,就会执行两次析构函数,既
释放两次同一片内存,所以会出错。解决这个问题就需用到深度拷贝

 
深度拷贝:(适用于堆分配内存的情况)

 
#define _CRT_SECURE_NO_WARNINGS 
#include<iostream>
#include<assert.h> 
using namespace std;
 class CopyConstructor
{
 public:
 CopyConstructor(const char* str)
 {
 m_len = strlen(str);

 m_p = (char*)malloc(m_len + 1); 
strcpy(m_p,str); 
}
/*实现深度拷贝其实就是自定以拷贝函数,然后在拷贝函数中重新申请一片内存,此时拷贝就不会出现一片内存有两个指针同时指向的问题*/
	CopyConstructor(const CopyConstructor &oop1)
	{
		m_len = oop1.m_len;
		m_p = (char*)malloc(m_len + 1);
		strcpy(m_p, oop1.m_p);
	}
	~CopyConstructor(void)
	{
		if (m_p!=NULL)
		free (m_p);
	}
	void print()
	{
	
		cout << m_p << endl;
	}
private:
int	m_len;
char*	m_p;
};
void maindis(void)
{
	CopyConstructor opp2("nihao!");
	CopyConstructor opp3(opp2);
	opp3.print();
}
int main()
{
	maindis();
	system("pause");
	return 0;
}

 

 

 

ROS-订阅与处理激光雷达scan话题 激光雷达通常有四个性能衡量指标:测距分辨率、扫描频率(有时也用扫描周期)、角度分辨率及可视范围。测距分辨率衡量在一个给定的距离下测距的精确程度,通常与距离真实值相差在5-20mm;扫描频率衡量激光雷达完成一次完整扫描的快慢,通常在10Hz及以上;角度分辨率直接决定激光雷达一次完整扫描能返回多少个样本点;可视范围指激光雷达完整扫描的广角,可视范围之外即为盲区。 阅读详情

相关推荐

Windows下用MSYS2一键搞定Verilator安装(附国内镜像加速)

本文详细介绍了在Windows系统下,如何利用MSYS2工具和国内镜像源,快速、高效地完成Verilator的安装与配置。通过替换清华镜像源加速下载,并配合Pacman包管理器,实现近乎一键式的安装流程,有效解决了传统方法步骤繁琐、网络依赖下载慢的问题,为数字电路仿真提供了便捷的Windows环境解决方案。

weixin_29208327的博客 596

C++拷贝构造函数

拷贝构造函数 格式: Point(const Point &p); 使用const 如果你定义拷贝构造函数时遇到这样的错误: no copy constructor available or copy constructor is declared 'explicit' 意味着你的拷贝构造函数的参数不是const 。 不使用explicit 而且拷贝构造函数是不能加explicit关键字的! 类型相同的对象才能称为“拷贝”,既然类型相同,那就不存在什么隐式转换的问题! 只有构造函数的参数类型..

quietbxj的博客 362

snipersim安装

snipersim安装记录,便于后续使用tip:snipersim需要在python2的环境下编译。

weixin_53507617的博客 917

浅拷贝和深拷贝

深拷贝浅拷贝

weixin_64103049的博客 420

ESXI 7 :创建统信V20_1050d服务器系统虚拟机

记录一下在 X86 架构创建统信V20_1050d 虚拟机遇到的问题。已遇到的问题有①:常规服务器环境下网络连接失败重点:按照桌面版本,有问题处理简单。

guyuelin123的博客 1968

CoMP 协同多点传输技术

CoMP CoMP是什么 解决什么问题 有什么缺点 CoMP(Coordinated Multiple Points)协同多点传输,通信术语,LTE-A的重要技术之一。 CoMP传输是指地理位置上分离的多个传输点,协同参与为一个终端的数据(PDSCH)传输或者联合接收一个终端发送的数据(PUSCH),参与协作的多个传输点通常指不同小区的基站。CoMP技术将边缘用户置于几个基站的同频率上,几...

ilean_J的博客 2万+

linux浅拷贝和深拷贝,浅析:浅拷贝 及 深拷贝的传统写法

浅拷贝会造成指针悬挂的问题。举个例子:两个对象是s1和s2的指针_str都指向new开辟的同一块空间,如下图,主程序结束时,对象逐个撤销,先撤销对象s2,会调用析构函数释放动态分配的内存;再撤销对象s1时,s1._str所指向的内存空间已经是无法访问了,而s2._str原先指向的那块内存却无法释放,出现了所谓的指针悬挂! 两个对象企图释放同一块内存,从而导致一块内存被释放两次这也是不行的,运行会出...

weixin_31907553的博客 405

Simeck算法流程

算法流程 paper在此:https://eprint.iacr.org/2015/612.pdf x ⋘\lll⋘ c denotes the cyclic shift of x to the left by c bits. x & y is the bitwise AND of x and y. x⊕yx \oplus yx⊕y is the exclusive-or (XOR) of x and y. github代码在此:https://github.com/bozhu/Simeck

Simp123 1074

Linux深层拷贝,深拷贝的现代写法

深拷贝的现代写法相比传统写法更加简单。也就是建立一个中间对象tmp,它的_str指针指向的内容是s._str的一份拷贝,交换tmp._str和_str后,_str就指向了s._str那份拷贝,出了作用域tmp会自动调用它的析构函数,也就把原先_str指向的内存释放了,同样达到了我们要的效果。如下图:#includeusing namespace std;class String{public:St...

weixin_33487811的博客 394

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 519

【基于大模型 + FAISS 的本地知识库与智能 PPT 生成系统:从架构到实现】

本文介绍了一个基于大模型(Ollama+DeepSeek)和FAISS向量数据库的本地知识库与智能PPT生成系统。该系统采用前后端分离架构,包含文档管理、向量检索、PPT生成等核心模块,可实现文档智能解析、语义检索和结构化PPT自动生成。通过MVC设计模式,系统实现了从文档上传、向量存储到内容检索、PPT生成的全流程自动化,有效解决了企业知识管理效率低下的问题。架构设计清晰,功能模块完备,为企业和个人提供了高效的文档处理与二次创作解决方案。

聚焦大数据、AI、数据库三大核心领域,分享 Flink/Spark 实时计算、数仓架构设计、AI 模型落地、数据库性能调优的实战干货,附可直接运行的源码与方案。提供企业技术内训、项目咨询与定制化服务,助力开发者与企业高效搞定数智技术难题。 1600

error C2558:no copy constructor available or copy constructor is declared 'explicit'

 Error 3 error C2558: class HuffmanCode : no copy constructor available or copy constructor is declared explicit d:/microsoft visual studio 8/vc/include/utility 37  今天发现了这个错误,发现报错的地方是 pair(c

帐前卒 专栏 3777

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9929

c++的默认拷贝构造函数,从深度拷贝和浅拷贝说起

1. c++类的默认拷贝构造函数的弊端c++类的中有两个特殊的构造函数,(1)无参构造函数,(2)拷贝构造函数。它们的特殊之处在于: (1)当类中没有定义任何构造函数时,编译器会默认提供一个无参构造函数且其函数体为空; (2)当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,进行成员变量之间的拷贝。(这个拷贝操作是浅拷贝)这里只讲拷贝构造函数。在c语言中,int a = 5; /

echo_bright_的博客 4万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C#中的浅拷贝和深度拷贝

所谓浅拷贝就是复制值类型的字段,对该字段执行逐位复制。如果字段是引用类型的,则复制引用但不复制引用的对象。C#中每个类都有一个MemberwiseClone()方法,可以实现对对象的浅拷贝。先看个列子:namespace DeepCopy{    public class FullName    {        private string firstName;        pri

沧海一粟的专栏 785

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java深度拷贝(Deep Copy)和浅拷贝(Shallow Copy)

/ 深拷贝 Address 对象。Apache Commons Lang 提供了 SerializationUtils 工具来实现深拷贝。可以在类中实现 Cloneable 接口,并在 clone 方法中手动深拷贝所有属性。- 浅拷贝:复制对象的引用,内部的引用类型属性不会被复制,而是共享原对象的引用。- 深拷贝:不仅复制对象本身,还复制对象中的所有引用对象,生成完全独立的副本。- Cloneable 适用于简单对象,但需要手动处理嵌套对象。将对象序列化为字节流,再反序列化为新的对象,确保完全独立。

nbspzs的专栏 1029

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数组与对象的浅拷贝及深度克隆封装解析

本文聚焦于 JavaScript 中数组与对象的拷贝操作。详细介绍了数组、对象浅拷贝的原理与方法,同时深入探讨深度克隆封装的技术,不仅有理论阐述,还结合案例分析,帮助读者更好理解浅拷贝和深度克隆在实际编程中的应用及区别。

前端基地 374

Python 直接赋值、浅拷贝和深度拷贝解析

Python 直接赋值、浅拷贝和深度拷贝解析 直接赋值:其实就是对象的引用(别名)。 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝(deepcopy):copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。 字典浅拷贝实例 实例 >>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) &.

勤学如春起之苗,不见其增,日有所长! 辍学如磨刀之石,不见其损,日有所亏! 161

39 vector深入理解 · 迭代器失效&深度浅拷贝

学习总结

m0_66277256的博客 1092

Python 直接赋值、浅拷贝和深度拷贝

Python 直接赋值、浅拷贝和深度拷贝 直接赋值:保存的是引用。 b = a: 赋值引用,a 和 b 都指向同一个对象。 浅拷贝(copy):保存的是父对象,不会拷贝对象的内部的子对象。 b = a.copy(): 浅拷贝, a 和 b 是一个独立的对象,但他们的子对象还是指向统一对象(是引用)。 深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象,源对象和拷贝出来的对象是完全独立的。 b = copy.deepcopy(a): 深度拷贝, a 和 b

qq_39611310的博客 327

【C++笔记】深浅拷贝以及vector的深度剖析及其实现

哈喽,各位小伙伴大家好!上期我们讲了string的深度剖析和实现。今天我们来讲一下编码和string的深浅拷贝以及vector。话不多说,我们进入正题!我们都知道计算机只能存储0或1。那像平时我们的文字或者英文,这些字符如何在计算机存储呢?这时有个编码表的东西就出来了。我们让一个字符和一个整形对应。也就是让字符和整形建立映射关系。这样计算机存储符号时存储对应的整形即可。所以编码本质就是——值和符号的映射编码关系。vector学习时一定要学会查看文档,vector的文档使用。

大白的编程日记. 2020

C#深度拷贝,浅拷贝

使用序列化的方法实现深度拷贝非常方便using System; using System.IO; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary;[Serializable] class Person : ICloneable { public object Cl

晓龙想飞 的专栏 408

python浅拷贝和深度拷贝

通过代码和结果来理解浅拷贝和深度拷贝,先来看看python中有那些常见的浅拷贝方法: 1.使用数据类型本身的构造器: l1 = [1,2,3] l2 = list(l1) l1 == l2 #True l1 is l2 #False #l2就是l1的浅拷贝,set、dict与上面的浅拷贝一致 t1 = (1,2,3) t2 = tuple(t1) t1 == t2 #True t1...

_再见阿郎_的专栏 1万+
上一篇: 构造函数
下一篇: 友元函数和友元类
LiBin1103
博客等级 码龄9年 38粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值