浅拷贝存在的问题及解决办法
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.解决拷贝构造所引发的,指针成员二次释放崩溃问题的方式有:深拷贝,传地址,传引用。
#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.解决拷贝构造所引发的,指针成员二次释放崩溃问题的方式有:深拷贝,传地址,传引用。
相关文章推荐
- 挂载NTFS格式的移动硬盘,root权限下依旧存在权限不够问题的解决办法
- 《BI项目笔记》SSAS部署时发生的问题——元数据管理器中存在错误 解决办法
- 当子级元素浮动时让父级元素高度自适应的三种方法(以及多个子集元素同时存在浮动和绝对定位时的问题的解决办法)
- SQLServer2008用户组或角色'*****'在当前数据库中已存在问题的解决办法
- 小波图像分解与重构程序存在的问题与解决办法
- 软件文档编写存在的问题和解决办法的思考
- 小波图像分解与重构程序存在的问题与解决办法
- 压测xx业务数据库资源大量等待,存在表锁问题,导致数据库无法正常执行解决办法
- 小波图像分解与重构程序存在的问题与解决办法
- 页面在不同屏幕分辨率下存在的问题及解决办法
- Oracle11g导出表空间存在空表导出失败问题解决办法
- jQuery,Table表头固定插件chromatable存在的问题及解决办法
- iOS中文文件名传输或url中存在汉字解决办法(urldecode解码的问题)
- 无法删除Oracle用户,提示存在当前连接问题的解决办法
- IAR 源代码拷贝到 MDK 乱码问题的解决办法
- RichTextEditor控件选中的字符和根据控件属性selection得到的字符存在差异的问题及解决办法
- 关于火车票12306网站出现“此网站的安全证书存在问题”解决办法
- RichTextEditor控件选中的字符和根据控件属性selection得到的字符存在差异的问题及解决办法
- 关于“打开项目**时发生问题,尝试退出并重新启动应用程序。如果问题仍然存在,则可能是由于正在使用不支持的项目版本,或者项目文件可能损坏”的问题的解决办法。
- jQuery,Table表头固定插件chromatable存在的问题及解决办法