C++类的拷贝构造及深浅拷贝问题

本文介绍了C++中拷贝构造函数的作用,区分了浅拷贝(仅复制变量值,不复制指针)可能导致的野指针问题,以及如何通过重载拷贝构造函数实现深拷贝,确保每个实例独立的内存空间。
摘要由CSDN通过智能技术生成

一.拷贝构造函数

C++类会提供一个默认拷贝构造函数,其做的操作是将另一个实例化类的引用传入,将数据复制,然后传入当前实例化类,可以对拷贝构造函数进行重载,这涉及到深浅拷贝的问题。

   Entity(const Entity& E)

拷贝赋值可以有以下两种写法

	Entity E2(E);
    Entity E2 = E;

二.浅拷贝

默认拷贝构造函数所做的就是一种浅拷贝。它的特点是只是将变量的值复制一份,然后赋值到当前实例化类的变量中,而不考虑指针变量。如果类中有指针变量,且进行了浅拷贝,那么会有多个类的指针指向同一块内存空间,导致对类的操作出现严重错误。且很可能出现野指针问题。为了解决这个问题,必须要对具有指针变量的类进行深拷贝操作。
下图可知进行浅拷贝的类,指针变量共享同一块地址空间在这里插入图片描述在这里插入图片描述由于类出作用域时会执行析构函数释放堆区内存,即E和E2都需要释放一次,而它们指向同一部分内存,所以会释放一次已经被释放的内存,导致程序崩溃

三.深拷贝

重载拷贝构造函数,对指针变量做处理,为其开辟大小相同的内存,这次拷贝赋值的不是地址,而是将原本地址中的值复制一份,赋值给新开辟的内存空间。这样就实现了每一个类的实例化对象的指针变量都有自己的一块内存维护。在这里插入图片描述 在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值