浅拷贝
浅拷贝只是拷贝了一个指针,并没有开辟一块新的内存。拷贝的指针和原来的指针 指向同一块地址。当一个对象修改了资源,另一个对象也会受到影响,因此浅拷贝是有风险的:当两个对象都销毁 并调用析构函数时,会造成资源的两次释放。
深拷贝
深拷贝不仅拷贝原对象的值,而且还开辟一块新的内存来存放拷贝来的值。深拷贝的两个对象是相互独立的,互不影响。另外,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