对象之间可以进行复制操作,包括采用拷贝构造函数的方式用一个对象去构造另一个对象(用一个对象的值初始化一个新的构造的对象),如同指针的复制一样,对象复制也分为浅复制和深复制
对象浅拷贝:
两个对象之间进行复制时,若复制完成后,他们还共同使用着某些资源(内存空间),其中一个对象的销毁会影响另一个对象(动态顺序表)
如果没有显式提供拷贝构造函数与赋值运算符重载,编译器会生成一个默认的拷贝构造函数和运算符重载(默认为位的拷贝,将一个对象中的内容原封不动的拷贝到到另一个对象中。如果类中涉及到资源管理,则会使得多个对象在底层共用同一块资源,在销毁对象时,就会导致一份资源释放多次引起程序崩溃)
如果一个类中涉及到资源,该类必须显式提供拷贝构造含糊,赋值运算符重载函数,析构函数
//类似系统生成的默认拷贝构造函数的方式
//值的拷贝方式—–内存的拷贝
//后果:多个对象共用同一份资源,在销毁时同一份资源被释放多次而引起程序的崩溃
1 | String(const String& s) |
对象深拷贝:
当两个对象之间进行复制时,若复制完成后,它们不会共享任何资源(内存空间),其中一个对象的销毁不会影响另一个对象
1 | String(const String& s) |
此时查看监视,发现s1与s2地址空间并不一样,不会产生内存泄露问题,也可以正常析构销毁
浅拷贝问题的String类
1 | class String |
使用深拷贝进行处理
传统方式
1 | class String |
现代写法
1 | //代码较简洁 |
写时拷贝
1.在对象中定义一个成员变量来计数
1 | class String |
2.使用static修饰成员变量,但是所有对象共享的,而资源有可能会有多分,每调用一次构造就将_count置为1了,不能针对多份资源
1 | //static也不可以,是类中所有对象共享的 |
3.写时拷贝(COW copy on write):浅拷贝+引用计数+在向对象写内容时,是否需要给当前对象独立空间
1 |
|