一、深拷贝与浅拷贝
由系统提供的默认拷贝构造函数的实现是浅拷贝,浅拷贝是简单地对成员变量逐个进行拷贝赋值,一般不需要用
户自定义浅拷贝构造函数,系统会提供默认的浅拷贝构造函数。但是有时系统提供的浅拷贝构造函数是无法满足实际
的编程需求的,因此可能需要用户自己定义拷贝构造函数。
1、浅拷贝存在的问题
当类中包含指针型成员变量,并且在构造函数中为该指针型成员变量通过malloc函数或new运算符在内存中开辟
空间时,会出现double free的现象。
分析:
1、浅拷贝把指针型成员变量的值拷贝赋值给同类对象的指针型成员变量,那么两个对象的指针型成员变量指向同一
块内存空间。
2、当在析构函数中做对象的清理工作时会释放指针型成员变量在堆区分配的动态内存,这样就会造成同一块内存多
次释放的问题。
2、深拷贝
深拷贝可以解决浅拷贝存在的问题,深拷贝可以为新对象中的指针型成员变量重新申请动态内存,然后将原对
象指针型成员变量所指向内存单元的值拷贝赋值过来。这样两个对象的指针型成员变量分别指向不同的内存空间,
但是内存空间中存放的值相同。
如果进行深拷贝,则需要自己定义拷贝构造函数。
二、深赋值与浅赋值
1、深赋值与深拷贝的比较
首先,我们谈谈深拷贝的问题。拷贝构造函数的调用时期是在用一个已存在的对象去初始化一个同类的新对象时
发生。此时,新的对象正在创建过程中,对象空间并不存在,因此需要在拷贝构造函数中为指针型成员变量申请堆
空间。然后将原对象指针型成员变量所指向内存单元的值拷贝赋值给新对象指针型成员变量所指向的内存单元。
深赋值是当前对象已经存在,定义对象时调用了该类的构造函数,在构造函数中已经为指针型成员变量开辟了
堆空间。直接将原对象指针型成员变量所指向内存单元的值赋值给新对象指针型成员变量所指向的内存单元即可,
不必再申请堆区空间。
2、浅赋值存在的问题
浅赋值不仅会造成申请的堆区空间无法释放,还会造成double free的现象。
3、深赋值
如果进行深赋值,需要重新定义运算符重载函数。