浅拷贝又称值拷贝,只把源对象的值拷贝给目标对象
以下述程序为例,两个对象的p是指向同一块内存空间,程序结束时执行析构函数(两次析构),先是a2去调用析构函数,释放了它指向的内存区域,接着a1又去调用析构函数,这时候析构函数企图释放一块已被释放的内存区域,程序将会崩溃。
#include <iostream>
using namespace std;
class AA
{
public:
int *p;
public:
AA()
{
p = new int(100);//执行构造函数时,在堆区开辟一块空间,赋值为100
}
~AA()
{
delete p;
}
};
int main()
{
AA a1;
cout << *a1.p << endl;
AA a2 = a1;//浅拷贝,只是把a1中p的值拷贝给a2,即两个对象的p是指向同一块内存空间
cout << *a2.p << endl;
system("pause"); //程序结束时,执行析构函数,
return 0;
}
那么如何解决?
答:深拷贝
拷贝的时候先开辟一个跟源对象成员空间一样大小的空间,再将空间的内容拷贝过来
加一个深拷贝构造函数:
AA(AA &a)
{
p = new int; //开辟新的空间实现深拷贝
*p = *a.p;
}
如此一来,就有两个空间,执行析构的时候,就不会出现释放已释放的空间的现象
完整代码为:
#include <iostream>
using namespace std;
class AA
{
public:
int *p;
public:
AA()
{
p = new int(100);//执行构造函数时,在堆区开辟一块空间,赋值为100
}
AA(AA &a)
{
p = new int; //开辟新的空间实现深拷贝
*p = *a.p;
}
~AA()
{
delete p;
}
};
int main()
{
AA a1;
cout << *a1.p << endl;
AA a2 = a1;//浅拷贝,只是把a1中p的值拷贝给a2,即两个对象的p是指向同一块内存空间
cout << *a2.p << endl;
system("pause"); //程序结束时,执行析构函数,避免了释放已被释放的空间
return 0;
}