一.浅拷贝的引出
首先我们看下面的代码
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这样上面的问题就解决了,因为在t1初始化t2的时候给t2的成员p也单独开辟了空间。
{
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;
}