类使用动态内存需注意的复制构造函数使用问题

人盡茶涼 提交于 2020-03-01 20:48:16

基础知识点介绍:复制构造函数

1、复制构造函数用于将一个对象复制到新创建的对象中。复制构造函数原型:

Class_name(const Class_name& ); // 接受一个类对象的常量引用。

2、何时调用复制构造函数:
新建一个对象并初始化为现有对象时调用,例如:

ClassA b(a);
ClassA c = a;
ClassA d = ClassA(a);
ClassA * e = new ClassA(a);

注:1、中间两种可能直接利用复制构造函数创建c和d,也可能先创建临时对象然后将其中内容赋值给c和d。
2、函数按值传递和返回对象,都将调用。因此建议传递引用,节省时间与空间

3、默认复制构造函数功能
1、逐个复制非静态成员到新对象中,复制的是成员的值 (浅复制)

存在的问题:

1、当存在static静态成员随构造函数调用增加时(计数器功能),默认复制构造函数不能实现。
在这里插入图片描述
2、当类中存在new初始化的指针(类对象申请了动态内存),默认构造函数只复制指针,不开辟新空间。导致两个指针指向同一块动态内存(浅复制),析构时会造成二次释放。
在这里插入图片描述

解决方法:

自己定义复制构造函数。
1、在复制构造函数中改变static变量的值。
2、在复制构造函数中对于成员变量为数值的可以复制;对于new的指针,需要开辟独立的动态内存,进行深度复制,避免类析构时二次释放的不确定性。

总结

类中使用动态内存,需要自定义复制构造函数。

参考资料
C++ Primer Plus: 章节:12.1.2与12.1.3

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!