拷贝:一个对象拷贝另一个对象,拷贝之后拷贝对象与被拷贝对象的内容一致。
在C++中一个类有4个特殊函数,构造函数,析构函数,拷贝构造,赋值函数,这4个函数会自动生成,自己定义了就调用自己定义的函数,没有定义就默认使用系统定义的,而其中的拷贝构造与赋值函数系统默认的就是浅拷贝,我们可以把类中的变量分为两部分,指针变量和普通变量,而深拷贝与浅拷贝的区别就在与是否为指针变量指向的内容重新开辟空间。
浅拷贝:对一个对象进行拷贝,普通变量如int a,拷贝的时候为重新开辟一个空间来保存a里面的内容,而指针变量 char *p会指向拷贝对象的空间并不会开辟新的空间。浅拷贝中当执行析构函数的时候两个对象的指针成员所指内存相同,但是程序结束时该内存却被释放了两次,会造成内存泄漏问题。这时就可以使用智能指针来解决浅拷贝带来的内存泄漏的问题
例:先定义P1对象,设置年龄与姓名,P2(P1), P2拷贝P1,P2重新为int age开辟空间保存年龄,但指针name会指向P1开辟的空间。注意:因为拷贝构造自己没有定义会调用系统默认的,所以可以不用自己写
深拷贝:相比于浅拷贝,深拷贝除了对普通变量开辟空间时也会为指针开辟新的空间并不会指向原来开辟的空间,注意:深拷贝与浅拷贝不同的是需自己重新。
例:
总结:浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针,根据需求不同,我们选择不同的方式。当对象之间需要有联系,通过共同访问的空间联系起来这时我们就用浅拷贝,当拷贝对象与原对象没有任何联系各自都拥有自己的空间我们就用深拷贝。
下面是在vim中的关键代码