C++ || 浅拷贝 深拷贝

21 篇文章 0 订阅

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

值类型(基本类型)数据直接存储在栈中,例如:字符串(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;
	}

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

如果不需要拷贝构造时

SeqList (const SeqList& str) = delete;

深拷贝

  • 深拷贝对于基本数据类型,直接复制数据值,对于引用数据类型,开辟新的内存空间,在新的内存空间里复制一个一模一样的对象新旧对象不共享内存,修改其中一个对象的值,不会影响另一个对象
  • 深拷贝就是两个对象对应两个不同的地址,修改一个对象的属性,另一个不会改变
		//防止浅拷贝
		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;
		}

各对象的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. 浅拷贝修改一个对象时,另一个也会修改深拷贝修改一个对象时,另一个不会随之修改
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值