何為淺拷貝和深拷貝? 淺拷貝其實只是復制對象,而不復制它引用的對象。即,拷貝對象的所有變量都含有被拷貝對象所含有的值,而且拷貝對象對其他對象的引用仍然指向原來的對象。例如: char ori[]=“hello”; char *copy=ori; 這裡copy的賦值操作就是淺拷貝;copy的值等於ori的值,並且copy所指向的對象與ori相同,但是copy與ori並不是完全相等,並沒有完全復制ori。 char ori[]="hello"; char *copy=new char[]; copy=ori; 深拷貝是把要復制的對象所引用的對象都復制了一遍,也就是復制對象含有了被復制對象相同的值,但是引用的對象是被復制過的新對象,而不再是被復制對象所指的對象。 其實在OC中是一個經常遇到的問題,OC保留了obtain,assign,copy等關鍵字來強調淺拷貝和深拷貝,而在C++語言裡沒有專門來強調這些。下面我們來分析一下下面的代碼: class A { char* a; public: A() { a= (char*)malloc(10);} ~A() {if(NULL != a) free(a);} }; void process() { A a, b; a = b; } 這段代碼就是典型的深拷貝與淺拷貝的理解錯誤問題。 C++默認的是執行類屬性的淺拷貝啊,這裡a對象只是淺拷貝了b對象,即使用了淺復制 a分配的內存,沒有得到釋放 b分配的內存釋放了兩邊,因此這裡會有內存洩露。