何为浅拷贝和深拷贝?
 
浅拷贝其实只是复制对象,而不复制它引用的对象。即,拷贝对象的所有变量都含有被拷贝对象所含有的值,而且拷贝对象对其他对象的引用仍然指向原来的对象。例如:
 
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分配的内存释放了两边,因此这里会有内存泄露。