您的位置:首页 > 其它

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

2018-02-13 08:10 246 查看
演示:定义一个指针成员,在构造函数里面分配空间,在析构函数里面释放空间
#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.解决拷贝构造所引发的,指针成员二次释放崩溃问题的方式有:深拷贝,传地址,传引用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C 指针成员 深拷贝
相关文章推荐