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

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

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的指针,需要开辟独立的动态内存,进行深度复制,避免类析构时二次释放的不确定性。

总结

1、类中使用动态内存(new),需要自定义复制构造函数。
2、当不需要复制时,以防错误使用,将复制构造函数设置为私有,则调用时编译出错提醒。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值