2018-04-19 创建人:Ruo_Xiao
开发环境:VS2010
邮箱:xclsoftware@163.com
1、浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,其实两个指针指向的是同一个内存区域。
2、深拷贝:将一个指针按照另一个指针进行申请内存,即:两个指针指向的是不同的内存区域。
3、栗子:
#include <string>
#include <iostream>
using namespace std;
class A
{
public:
A()
{
piTest = nullptr;
piTest = new int[3]();
for (int i=0;i<3;++i)
{
piTest[i] = i;
}
}
A(const A &a)
{
piTest = nullptr;
piTest = new int[3]();
for (int i=0;i<3;++i)
{
piTest[i] = i;
}
}
~A()
{
if (piTest!=nullptr)
{
delete []piTest;
piTest = nullptr;
}
}
public:
int *piTest;
};
int main()
{
A a1;
A a2(a1);
cout<<"a1.piTest = "<<a1.piTest<<ends<<"a2.piTest = "<<a2.piTest<<endl;
cin.get();
return 0;
}
上述栗子的结果是:
若注释掉代码中的“A(const A &a)”的函数,则结果如下:
4、解析:
(1)对于类的拷贝构造函数,若使用对象建立的默认拷贝构造函数,则对于类的成员变量来说是简单的赋值,即:浅拷贝。这种情况就造成了指针指向了同一个内存区域,释放内存时,假设a1释放完成,由于a2的piTest和a1的piTest指向的是同一块区域,则a2释放内存时就会造成内存访问错误。
(2)若自己建立拷贝构造函数,则进行的是深拷贝,这样两个piTest指向的内存就不一样了。释放对象时也不会造成内存泄露。