文章目录
数据分为基本数据类型和引用数据类型
值类型(基本类型):数据直接存储在栈中,例如:字符串(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;
}
深拷贝_浅拷贝的区别
- 在拷贝基本数据类型时,两者都是直接复制数据值
- 在拷贝引用数据类型时,浅拷贝复制的是对象的引用地址,而深拷贝则是新开辟一块内存空间,在里面复制一个一模一样的对象
- 浅拷贝出的两个对象指向的是同一块内存区域,深拷贝出来的两个对象有各自的内存区域
- 浅拷贝在修改一个对象时,另一个也会修改。深拷贝在修改一个对象时,另一个不会随之修改