当前位置: 首页 > 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

在这里插入图片描述

相关文章:

  • 基于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的执行引擎处理
  • 网站建设的需求分析/线上免费推广平台都有哪些
  • 陕西省交通建设集团西长分公司网站/外贸接单平台哪个最好
  • 做外贸b2b网站/无锡百度关键词优化
  • 赤水市住房和城乡建设局网站/企业策划方案怎么做
  • 合肥大型网站建设公司/西安百度快照优化
  • 淘宝网站是怎么做的吗/百度高级搜索页面