C++学习记录-面向对象-浅拷贝和深拷贝

一、浅拷贝

浅拷贝,对对象进行简单的复制粘贴操作,会带来一些问题(和在《赋值运算符重载》中的问题一样)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//创建一个类
class chara {

public:
int* a;

public:
chara(int t)
{
a = new int(t);
}//有参构造函数

chara(const chara& p)
{
a = p.a;
}//拷贝构造函数

~chara()
{
if (a != NULL)
{
delete a;
a = NULL;
}
}//利用析构函数释放内存,防止内存泄漏
};
1
2
3
chara p1(10);
chara p2(p1);
//创建两个对象

此时运行会出错,因为p1,p2的a指针指向的是同一块内存,调用p1,p2的析构函数时导致了内存重复释放

解决方法:利用深拷贝,让p2中的a重新开辟一块内存,存放的值和p1的一样

二、深拷贝

对拷贝构造函数修改如下:

1
2
3
4
chara(const chara& p)
{
a = new int(*(p.a));
}

利用深拷贝,可以防止重复释放内存