简单的浅拷贝和深拷贝

时间:2021-11-16 21:26:44

一.浅拷贝的引出

首先我们看下面的代码

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也单独开辟了空间。