淺拷貝
淺拷貝只是拷貝了一個指針,并沒有開辟一塊新的內存。拷貝的指針和原來的指針 指向同一塊地址。當一個對象修改了資源,另一個對象也會受到影響,因此淺拷貝是有風險的:當兩個對象都銷毀 并調用析構函數時,會造成資源的兩次釋放。
深拷貝
深拷貝不僅拷貝原對象的值,而且還開辟一塊新的內存來存放拷貝來的值。深拷貝的兩個對象是相互獨立的,互不影響。另外,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