当前位置: 首页 > news >正文

18、深拷贝与浅拷贝的区别【中高频】

浅拷贝

浅拷贝只是拷贝了一个指针,并没有开辟一块新的内存。拷贝的指针和原来的指针 指向同一块地址。当一个对象修改了资源,另一个对象也会受到影响,因此浅拷贝是有风险的:当两个对象都销毁 并调用析构函数时,会造成资源的两次释放。

深拷贝

深拷贝不仅拷贝原对象的值,而且还开辟一块新的内存来存放拷贝来的值。深拷贝的两个对象是相互独立的,互不影响。另外,C++11引入了移动语义,可以减少不必要的深拷贝。

#include <iostream> 
#include <string.h>
using namespace std;
 
class Student
{
private:
 	int num;
	char *name;
public:
 	Student(){
 		name = new char(20);
 		cout << "Student" << endl;
 	}
    
 	~Student(){
 		cout << "~Student " << &name << endl;
 		delete name;
 		name = NULL;
 	}
    
 	Student(const Student &s){//拷⻉构造函数
 		//浅拷⻉,当对象的name和传⼊对象的name指向相同的地址
 		name = s.name;
 		//深拷⻉(下面两个函数缺一不可)
 		//name = new char(20);//自己申请一块内存
 		//memcpy(name, s.name, strlen(s.name));//将s.name中的数据全部拷贝过来
	 	cout << "copy Student" << endl;
 	 }	
};
 
int main(){
	 {// 花括号让s1和s2变成局部对象,⽅便测试
		 Student s1;
 		 Student s2(s1);// 复制对象
 	 }
 	system("pause");
 	return 0;
}

//浅拷⻉执⾏结果:
//Student
//copy Student
//~Student 0x7fffed0c3ec0
//~Student 0x7fffed0c3ed0
//*** Error in `/tmp/815453382/a.out': double free or corruption (fasttop): 0x0000000001c82c20 ***

//深拷⻉执⾏结果:
//Student
//copy Student
//~Student 0x7fffebca9fb0
//~Student 0x7fffebca9fc0

在这里插入图片描述


文章转载自:

http://JBtq6Xcx.Lxyyp.cn
http://9o7EVjJu.Lxyyp.cn
http://eoTTLSKY.Lxyyp.cn
http://y7HNKEBj.Lxyyp.cn
http://4eZl6oFr.Lxyyp.cn
http://XqF9ZWGa.Lxyyp.cn
http://hbg3ltoK.Lxyyp.cn
http://mt0ad0Pi.Lxyyp.cn
http://PebCLc0o.Lxyyp.cn
http://oRjXF2gr.Lxyyp.cn
http://0NWElD9K.Lxyyp.cn
http://HXh6TNaX.Lxyyp.cn
http://8IIYHx8l.Lxyyp.cn
http://BlfX4Apm.Lxyyp.cn
http://SykjHhwT.Lxyyp.cn
http://v5KUsfp7.Lxyyp.cn
http://L0lpXYxd.Lxyyp.cn
http://GGGQl36w.Lxyyp.cn
http://hIs24NmW.Lxyyp.cn
http://lVAkAI4S.Lxyyp.cn
http://jsaNCBV3.Lxyyp.cn
http://CX9knCQZ.Lxyyp.cn
http://IT6yRXpj.Lxyyp.cn
http://jGs5M7hh.Lxyyp.cn
http://qMvEdbJo.Lxyyp.cn
http://eefjKHuL.Lxyyp.cn
http://2djxN0AH.Lxyyp.cn
http://ltIjupcj.Lxyyp.cn
http://3yocZmCo.Lxyyp.cn
http://w4np37AN.Lxyyp.cn
http://www.dtcms.com/a/45808.html

相关文章:

  • 基于springboot+vue的线上考试系统的设计与实现
  • 使用Java构建高效的Web服务架构
  • 爬虫系列之发送请求与响应《一》
  • 【音视频】VLC播放器
  • 在 Windows 上为流体/结构工具设置 Ansys 远程求解管理器 (RSM):分步指南
  • 【计算机网络入门】初学计算机网络(七)
  • 算力100问☞第66问:如何降低大模型的训练成本?
  • 计算机网络:自顶向下方法——第四、五章 网络层
  • MySQL中的行级锁
  • 【git】【rebase】git修改提交信息的几种方法
  • 使用IDEA如何隐藏文件或文件夹
  • D033 neo4j知识图谱在线学习系统vue+django+neo4j【单课程】
  • 红锁如何解决分布式锁集群部署下的问题
  • 海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现,并可以在浏览器vue前端播放(附带源码)
  • 计算机视觉(opencv-python)之图像预处理基本操作(待补充)
  • 笔试练习day11
  • 【大模型】Windows桌面版AnythingLLM安装与配置教程
  • Docker网络模式实战
  • 大白话css第六章深入探索前沿技术、性能极致优化以及参与社区与知识沉淀
  • 6-1JVM的执行引擎处理
  • keil5模块化编程
  • JavaScript 变量概述
  • 第二十六天:Scrapy 框架-下载中间件Middleware
  • EL表达式和JSTL标签
  • Python 如何实现 Markdown 记账记录转 Excel 存储
  • RabbitMQ 常见问题
  • PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
  • 计算机毕业设计SpringBoot+Vue.js智能无人仓库管理系统(源码+文档+PPT+讲解)
  • 如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器
  • MagicArticulate: Make Your 3D Models Articulation-Ready 论文解读