简单的浅拷贝和深拷贝

一.浅拷贝的引出

首先我们看下面的代码

class stu
{
private:
	char *p;
	int  len;
public:
	stu(const char *src)//定义构造函数
	{
		len = strlen(src);
		p =(char *)malloc(len + 1);
		strcpy(p, src);
	}
	~stu()//析构函数
	{
		if (p != NULL)
		{
			free(p);
			p = NULL;
			len = 0;
		}
	}
};
int main()
{
	stu t1 = ("hello");
	stu t2 = t1;//对象初始化对象
	system("pause");
	return 0;
}
这个代码在最后执行析构函数的 时候崩溃了


因为在上述代码中,我们自己并没有定义拷贝函数,所以在对象初始对象的时候,系统自动调用默认拷贝函数,但是默认拷贝构造好函数只是执行浅拷贝,即将对象tl的成员值复制过来给对象t2, 你现在知道为什么会出现bug了吧,下面我用图来解释,这也正是浅拷贝带来的问题


二.怎么解决上述的问题,当然这个时候就需要我们自己去写一个拷贝构造函数,即深拷贝了

代码如下

class stu
{
private:
	char *p;
	int  len;
public:
	stu(const char *src)//定义构造函数
	{
		len = strlen(src);
		p =(char *)malloc(len + 1);
		strcpy(p, src);
	}
	stu(const stu &m)//定义的深拷贝函数
	{
		len = m.len;
		p = (char *)malloc(len + 1);
		strcpy(p, m.p);
	}
	~stu()//析构函数
	{
		if (p != NULL)
		{
			free(p);
			p = NULL;
			len = 0;
		}
	}
};
int main()
{
	stu t1 = ("hello");
	stu t2 = t1;//对象初始化对象
	system("pause");
	return 0;
}
这样上面的问题就解决了,因为在t1初始化t2的时候给t2的成员p也单独开辟了空间。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值