一、深拷贝与浅拷贝
浅拷贝又称为引用拷贝,就是拷贝之后,共用同一个实体,只是引用名不同了,对其所做的改变都将改变原来的值。
深拷贝又称为值拷贝,拷贝之后,有不同的名字,不同的内存空间,对其所做的改变都不会改变原来的值。
主要区别:在拷贝指针的时候,浅拷贝只是把指针拷贝一份,指针所指的内容不拷贝,拷贝后的结果是,两个不同的指针,但是指向同一块内存地址,这样就造成了在调用析构函数进行析构的时候,对同一块内存会析构两次,从而造成程序崩溃,内存泄露。
可以举例来理解,比如原函数中自定义的构造函数中,存在通过new进行动态分配的数据成员(new返回的是一个指针,指向新分配的内存,也就是拷贝时存在指针的拷贝的情况),而如果原函数中没有自定义的拷贝构造函数(内含对动态数据成员的重新动态分配),此时系统就会调用默认的构造函数,也就是只拷贝了指针,而该拷贝后的指针仍然指向原分配的内存。
浅拷贝,不只是把指针拷贝一份,还拷贝指针所指向的内容,拷贝后的结果是不同的两个指针,分别指向两个不同的内存。
所以在对象中存在指针或者引用的拷贝时,存在动态成员时,存在堆(比如new这种动态分配时),文件,系统资源时,一定要用深拷贝,避免浅拷贝,而避免浅拷贝是通过,添加自定义的拷贝构造函数,并且在自定义的拷贝构造函数中必须对动态成员,重新进行内存的动态分配。