浅拷贝存在的问题及解决办法

演示:定义一个指针成员,在构造函数里面分配空间,在析构函数里面释放空间

#include<iostream>

using namespace std;
class CStu
{
public:
int *a;
CStu()
{
a=new int[2];
a[0]=12;
a[1]=13;
}
~CStu()
{
delete [] a;
}
};
int main()
{
CStu at;
cout<<at.a[0]<<" "<<at.a[1]<<endl;
CStu st=at;//调用拷贝
cout<<st.a[0]<<" "<<st.a[1]<<endl;
system("pause");
return 0;

}

运行结果出现崩溃,如图所示:

浅拷贝存在的问题及解决办法

一般原因:数组越界,出现了野指针,分母为零的表达式等情况都会造成崩溃,通过断点调试,发现在释放指针成员的时候,程序崩溃。

崩溃原因:首先创建了一个at对象,成员a为一指针数组,在此假设指向一块空间ox10,(a为一4个字节的指针变量,存放地址),调用拷贝构造st=at,使得成员的值相等,即st.a=at.a,st.a=ox10,程序首先调用at的析构函数,释放at.ox10,随后调用st的析构函数,放st.ox10,造成同一空间重复释放,属于野指针操作。

因此引入深拷贝:

CStu(const CStu &b)//深拷贝
{
//this->a=b.a;//指针成员直接的赋值,这也是造成问题的原因
//申请空间
this->a=new int[2];//与at不指向同一空间
//赋值
this->a[0]=b.a[0];
this->a[1]=b.a[1];//多个元素可以通过memcpy(this->a,b.a,8)函数将一块空间的内容复制到另一块空间,通过MSDN查看其使用方法

}

总结:1.如果为char型指针成员,可以通过strcpy来复制

         2.不涉及指针成员,没有必要写深拷贝;

         3.解决拷贝构造所引发的,指针成员二次释放崩溃问题的方式有:深拷贝,传地址,传引用。