拷贝构造函数
拷贝构造函数是一种特殊的构造函数,是构造函数的重载形式。
分三种形式:
- 不可变类型不存在深浅拷贝
- 浅拷贝,只拷贝对象本身,拷贝时只会增引用,不会拷贝对象中的元素
- 深拷贝不但拷贝对象本身,还拷贝了其中的元素。
浅拷贝
用户未显示定义,而是由系统生成的默认的拷贝构造函数,称为浅拷贝
结果
编译系统在我们自己没有自定义拷贝构造函数时,会在拷贝对象时候调用默认拷贝构造函数,进行浅拷贝,即对指针name拷贝后出现两个指针指向同一个内存块。所以析构时候就析构了两次,导致内存泄漏。
浅拷贝的对象S1 S2指向同一块内存空间,函数结束时,先销毁S2,同时也free掉了这块空间,而S1仍指向原来的地址空间,这时,S1就成为了一个野指针,程序出错。
浅拷贝的对象只是目标对象的一个引用,新对象和目标对象指向同一块内存空间,对于日期类这类不进行资源管理的类可以不用显示调用;但对于String类这类申请空间资源的类必须显示调用拷贝构造函数,否则会造成资源泄露。
深拷贝
所以在对“含有指针成员的对象”进行拷贝时,必须要自己定义拷贝构造函数,使拷贝构造后的对象指针成员有自己的内存空间,即进行深拷贝,避免内存泄漏。
深拷贝是将对象完整的从内存中拷贝出一份,从堆内存分配一个新的存放新对象,并且不会对原来对象产生影响。
结果:
构造一次
拷贝构造一次
析构两次