• C++ || 浅拷贝 深拷贝


    数据分为基本数据类型和引用数据类型

    值类型(基本类型)数据直接存储在栈中,例如:字符串(string)、数值(number)、布尔值(boolean)、undefined、null
    引用类型存储在栈中的是对象的引用地址,对象数据存放在堆内存中,例如:对象(object)、数组(array)、函数(function)

    浅拷贝

    • 浅拷贝是创建一个新对象,如果属性是基本数据类型,拷贝的就是基本类型的数据值,如果属性是引用数据类型,拷贝的就是对象的引用地址新旧对象指向同一个内存地址
    • 浅拷贝就是一个改变,另一个也会改变
    • 浅拷贝 在释放data时 发生重复性释放
      系统提供的是浅拷贝

    seqb先释放data seqa在释放时 data已经被释放了

    //浅拷贝
    	SeqList(const SeqList& str)
    		:cursize(str.cursize), maxsize(str.maxsize),data(str.data)
    		//缺省的拷贝构造
    	{	}
    	SeqList& operator=(const SeqList& str)
    	{ //缺省的等好远算符重载
    		if (this != &str)
    		{
    			cursize = str.cursize;
    			maxsize = str.maxsize;
    			data = str.data;
    		}
    		return *this;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    出现内存泄漏
    在这里插入图片描述
    凡是在类中需要设计指向内核态,设计信号量,互斥量时 都必须要设计自己的拷贝构造

    如果不需要拷贝构造时

    SeqList (const SeqList& str) = delete;
    
    • 1

    深拷贝

    • 深拷贝对于基本数据类型,直接复制数据值,对于引用数据类型,开辟新的内存空间,在新的内存空间里复制一个一模一样的对象新旧对象不共享内存,修改其中一个对象的值,不会影响另一个对象
    • 深拷贝就是两个对象对应两个不同的地址,修改一个对象的属性,另一个不会改变
    		//防止浅拷贝
    		if (NULL != src._name)
    		{   //判空
    			_name = new char[strlen(src._name) + 1];
    			memset(_name, 0, strlen(src._name) + 1);
    			for (int i = 0; i < strlen(src._name); i++)
    			{
    				_name[i] = src._name[i];
    			}
    		}
    		else
    		{
    			_name = NULL;
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    各对象的data都指向自己的堆区

    //深拷贝
    SeqList(const SeqList& str)
    	{
    	maxsize = str.maxcursize;
    	cursize = str.cursize;
    	data = (int*)malloc(sizeof(int)*maxsize);
    	//自己开辟空间
    memcpy(data,str.data,sizeof(int)*str.cursize);
    //有数据 导向 释放就不会出现重复释放
    	}
    	
    	SeqList& operator=(const SeqList& str)
    	{
    		if (this != &str)
    		{
    			cursize = str.cursize;
    			maxsize = str.maxsize;
    			free(data);
    data = (int*)malloc(sizeof(int*str.maxsize);
    memcpy(data,str.data,sizeof(str.cursize);
    		return *this;
    	}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    深拷贝_浅拷贝的区别

    1. 在拷贝基本数据类型时,两者都是直接复制数据值
    2. 在拷贝引用数据类型时,浅拷贝复制的是对象的引用地址,而深拷贝则是新开辟一块内存空间,在里面复制一个一模一样的对象
    3. 浅拷贝出的两个对象指向的是同一块内存区域深拷贝出来的两个对象有各自的内存区域
    4. 浅拷贝修改一个对象时,另一个也会修改深拷贝修改一个对象时,另一个不会随之修改
  • 相关阅读:
    Carla安装记录
    猿创征文|Vue源码分析(Render渲染函数)
    cv2.approxPolyDP函数实现轮廓线的多边形逼近
    栈的基本操作
    Vue3.0(八):网络请求库axios
    java积累
    [附源码]Python计算机毕业设计Django社区生活废品回收APP
    力扣刷题第二十八天--二叉树
    基于SSM框架的《超市订单管理系统》Web项目开发(第四天)用户管理,增删改查(日期插件的使用)
    Matlab:Matlab编程语言学习之变量&常量/数据类型的简介、技巧总结案例应用之详细攻略
  • 原文地址:https://blog.csdn.net/LQEmptycity/article/details/121309758