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