C++基础教程之指针拷贝详解

指针是编程人员的梦魇,对C语言的开发者是如此,对C++的开发者也是如此。特别是在C++中,如果不注意处理类中的指针,非常容易出问题。如果朋友们不相信可以看看下面的代码:
class data
{
int* value;
public:
data(int num){
if(num > 0)
value = (int*)malloc(sizeof(int)* num);
}
~data(){
if(value)
free(value);
}
};
void process()
{
data m(10);
data p = m;
}
上面的这段问题有没有什么问题?大家可以自己先用笔在草稿纸上面画一画。然后上机用实际环境验证一下。果不其然,系统提示内存发生了错误。为什么呢?就是因为内存发生了两次释放。我们看以看一下process的汇编代码:
21: data m(10); 0040105D push 0Ah 0040105F lea ecx,[ebp-10h] 00401062 call @ILT+15(data::data) (00401014) 00401067 mov dword ptr [ebp-4],0 22: data p = m; 0040106E mov eax,dword ptr [ebp-10h] 00401071 mov dword ptr [ebp-14h],eax 23: } 00401074 lea ecx,[ebp-14h] 00401077 call @ILT+5(data::~data) (0040100a) 0040107C mov dword ptr [ebp-4],0FFFFFFFFh 00401083 lea ecx,[ebp-10h] 00401086 call @ILT+5(data::~data) (0040100a) 0040108B mov ecx,dword ptr [ebp-0Ch] 0040108E mov dword ptr fs:[0],ecx 00401095 pop edi 00401096 pop esi 00401097 pop ebx 00401098 add esp,54h 0040109B cmp ebp,esp 0040109D call __chkesp (004015b0) 004010A2 mov esp,ebp 004010A4 pop ebp 004010A5 ret
21行: data调用构造函数,分配内存给value
22行: 这里我们发现程序进行内存拷贝,那么表示m变量value的数值和p变量中value的数值是一样的
23行:这里函数即将结束,所以系统调用m和p的析构函数,第一次析构的时候value指向的内存被释放,第二次析构的时候由于p变量value的数值非0,所以也需要释放内存,当然也需要进行析构处理,但是此时内存已经释放了,所以内存进行了二次释放,系统报错。
经过上面的研究,我们发现了问题和原因,那么应该怎么解决呢?既然问题是在拷贝函数这里,那么就要对拷贝函数进行特殊处理。目前就我个人理解,有两个方法供大家选择:
(1)对拷贝构造函数进行private处理,这样一旦出现了拷贝操作,编译器就会提示出错。
class data
{
int* value;
data(const data&) ;
public:
data(int num){
if(num > 0)
value = (int*)malloc(sizeof(int)* num);
}
~data(){
if(value)
free(value);
}
};
(2)编写拷贝构造函数,进行内存深复制
class data
{
int* value;
int number;
public:
data(int num){
if(num > 0)
value = (int*)malloc(sizeof(int)* num);
number = num;
}
data(const data& d){
if(NULL != d.get_ptr())
value = (int*) malloc(sizeof(int)* d.get_number());
number = d.get_number();
memmove(value, d.get_ptr(), sizeof(int)* number);
}
~data(){
if(value)
free(value);
}
int* get_ptr() const{ return value;}
int get_number() const {return number;}
};
我们看到,经过拷贝构造函数的定义后,原来的process函数解可以正常编译通过,没有问题。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# C++基础教程之指针拷贝
# 指针拷贝详解
# C++指针拷贝
# c++中深浅拷贝以及写时拷贝的实现示例代码
# 深入理解C/C++中的写时拷贝
# 详解C++中构造函数
# 拷贝构造函数和赋值函数的区别和实现
# 详解C++中String类模拟实现以及深拷贝浅拷贝
# C++ 中类的拷贝、赋值、销毁的实例详解
# 详解C++ 编写String 的构造函数、拷贝构造函数、析构函数和赋值函数
# C/C++ 浅拷贝和深拷贝的实例详解
# C++写时拷贝实现原理及实例解析
# 是在
# 发生了
# 就会
# 两次
# 这段
# 朋友们
# 果不其然
# 希望能
# 不相信
# 要对
# 什么呢
# 看一下
# 报错
# 谢谢大家
# 不注意
# 就我
# 有没有什么
# 进行了
# 画一
# 出现了
相关文章:
历史网站制作软件,华为如何找回被删除的网站?
如何在腾讯云免费申请建站?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何通过可视化优化提升建站效果?
建站主机SSH密钥生成步骤及常见问题解答?
建站之星伪静态规则如何正确配置?
如何用好域名打造高点击率的自主建站?
建站主机类型有哪些?如何正确选型
公司网站的制作公司,企业网站制作基本流程有哪些?
存储型VPS适合搭建中小型网站吗?
西安专业网站制作公司有哪些,陕西省建行官方网站?
如何解决VPS建站LNMP环境配置常见问题?
广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?
建站主机空间推荐 高性价比配置与快速部署方案解析
如何快速搭建安全的FTP站点?
如何在IIS7上新建站点并设置安全权限?
建站之星伪静态规则如何设置?
设计网站制作公司有哪些,制作网页教程?
如何在云服务器上快速搭建个人网站?
如何在万网自助建站中设置域名及备案?
临沂网站制作企业,临沂第三中学官方网站?
如何快速辨别茅台真假?关键步骤解析
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
如何用狗爹虚拟主机快速搭建网站?
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?
高端云建站费用究竟需要多少预算?
如何通过多用户协作模板快速搭建高效企业网站?
如何快速上传建站程序避免常见错误?
油猴 教程,油猴搜脚本为什么会网页无法显示?
建站之星后台密码遗忘如何找回?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
如何快速搭建个人网站并优化SEO?
,有什么在线背英语单词效率比较高的网站?
如何在建站主机中优化服务器配置?
头像制作网站在线制作软件,dw网页背景图像怎么设置?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
建站DNS解析失败?如何正确配置域名服务器?
建站VPS选购需注意哪些关键参数?
如何用已有域名快速搭建网站?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
如何在云主机上快速搭建网站?
如何用PHP快速搭建高效网站?分步指南
如何撰写建站申请书?关键要点有哪些?
建站之星价格显示格式升级,你的预算足够吗?
如何将凡科建站内容保存为本地文件?
成都网站制作报价公司,成都工业用气开户费用?
*请认真填写需求信息,我们会在24小时内与您取得联系。