C++深浅拷贝

浅拷贝:简单的赋值拷贝操作。当指针进行浅拷贝时可能会导致多个对象共用同一内存资源,同一块内存资源释放多次,导致崩溃或者内存泄漏,
深拷贝:在堆区中重新申请空间,进行拷贝操作。

例证:

#include<iostream>
using namespace std;
class Person
{
public:
	int age;
	int* height;
	Person()//无参构造函数
	{
		age = 19;
		height = new int(169);
	}
	~Person()//析构函数,其作用可以用来释放堆区的数据
	{
		if (height != NULL)
		{
           delete height;
		   height = NULL;
		}
	}
};
int main()
{
	Person p;
	Person q(p);
	system("pause");
}

程序运行会出错
编译器会提供一个默认的拷贝构造函数:

	Person(const Person &p)
	{
		age = p.age;
		height = p.height;
	}

“height = p.height;”这一句为简单的赋值操作,进行了浅拷贝,因此q的height指针与p的height指针会指向同一个内存空间,在程序结束前需要调用各自的析构函数,由于栈的特点,先调用q的析构,它的height指针不为空,因此会释放它所指向的空间,再调用p的析构函数,这里出现了问题,由于p的height指针不为空(其实是野指针了),因此需要释放其所指的内存空间,此空间在q的析构函数中已经被释放了,再次释放未非法操作,因此程序出错。

要解决此等错误,就要使得两指针指向不同的内存,因此需要我们自己提供拷贝构造函数:

	Person(const Person &p)//拷贝构造函数
	{
		age = p.age;
		height = new int(*p.height);
	}

这样p和q的指针都指向堆中不同内存单元,程序运行无误。
在写程序时,尽量避免多个指针指向同一个内存单元。

补:
默认情况下,编译器会给一个类提供三个函数:无参构造函数(函数体为空)、析构函数(函数体为空)、拷贝构造函数(对各属性进行值拷贝)
如果程序员提供了有参构造函数,则编译器不再提供无参构造函数,但会提供析构函数和拷贝构造函数。
如果程序员只提供了拷贝构造函数,则编译器不再提供任何其他构造函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值