C++深浅拷贝

在C++的深浅拷贝中,都是对对象的拷贝问题,只是在面对资源申请的时候,需要比较重视这个问题,因为这涉及到内存泄漏、多次析构的问题等。

1、浅拷贝。

对于浅拷贝来说,就是字节的拷贝,那如果在有资源申请和管理的时候,同一块空间可能存在析构两次的问题(两个对象共用同一块空间的问题),或者在改变一个对象的时候,另外一个对象也会被改变,例子:

class NEW
{
public:
	NEW()
		:_p(new int)
	{
		*_p = 10;
	}

	~NEW()
	{
		if (_p)
		{
			delete _p;
			_p = nullptr;
		}
	}
	void change_p(int num)
	{
		*_p = num;
	}
private:
	int* _p;
};

int main()
{
	//浅拷贝
	NEW n1;
	NEW n2;
	n2 = n1;
	n1.change_p(20);
//写了析构函数,这块空间还会被析构两次
	return 0;
}

2、深拷贝。

对于深拷贝来说,也会拷贝成员,但是拷贝后的对象管理的空间都是独立的,例子

class NEW
{
public:
	NEW()
		:_p(new int)
	{
		*_p = 10;
	}
	NEW& operator=(const NEW& n)
	{
		if (this!=&n)
		{
			_p=new int;
		}
		return *this;
	}

	~NEW()
	{
		if (_p)
		{
			delete _p;
			_p = nullptr;
		}
	}
	void change_p(int num)
	{
		*_p = num;
	}
private:
	int* _p;
};

int main()
{
	//深拷贝
	NEW n1;
	NEW n2;
	n2 = n1;
	n1.change_p(20);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值