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