VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 356|回复: 7

零基础C++ 37课,析构函数释放两次动态内存报错疑问

[复制链接]
44_avatar_middle
最佳答案
0 
在线会员 发表于 2021-1-22 00:49:50 | 显示全部楼层 |阅读模式
零基础C++ 37课,析构函数释放两次动态内存报错疑问 零基础C++ 37课,析构函数释放两次动态内存报错疑问

当析构stud1正常,当析构stud2时因为重复释放已经释放过的动态内存,所以报错,听懂了。但是。
我的疑问:第一次析构,if(p_name) 后面释放,指针变null,第二还能进入if后面的语句?p_name=null结果是为真?为什么能进入。




上一篇:求助各位大佬,关于地址与指针的小作业测试相关
下一篇:上位机运行一段时间后运行变慢
70_avatar_middle
最佳答案
32 
在线会员 发表于 2021-1-22 09:19:13 | 显示全部楼层
p_name 是成员变量 ,stud1.p_name = NULL , stud2.p_name 的值并没有变
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-22 14:10:58 | 显示全部楼层
本帖最后由 cpp2019 于 2021-1-22 14:12 编辑

类内部有指针操作就不能这么赋值: stud_2 = stud_1,赋值后你会看两个对象的地址是一样的,这就造成了一个对象被析构两次,所以会报错。
71_avatar_middle
最佳答案
0 
在线会员 发表于 2021-1-22 22:44:11 | 显示全部楼层
由于执行了stud_2=stud_1是浅拷贝赋值, 所以 stud_2对象的成员变量p_name与stud_1对象的成员变量p_name指向同一块内存地址。第一次析构函数的执行只是把stud_1对象的成员变量p_name赋值为NULL,stud_2对象的成员变量p_name值还是指向已经被释放内存的地址,并没有变化,所以值不为NULL。
35_avatar_middle
最佳答案
0 
在线会员 发表于 2021-1-25 16:34:25 | 显示全部楼层
cpp2019 发表于 2021-1-22 14:10
类内部有指针操作就不能这么赋值: stud_2 = stud_1,赋值后你会看两个对象的地址是一样的,这就造成了一个 ...

他没有重载 = ,可能是以为在构造函数里有重新分配内存就行了。
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-25 17:52:41 | 显示全部楼层
本帖最后由 cpp2019 于 2021-1-25 18:28 编辑
人走茶不凉 发表于 2021-1-25 16:34
他没有重载 = ,可能是以为在构造函数里有重新分配内存就行了。


怪我上次回帖没说完!
类内部有操作指针分配内存空间等操作,则必须写拷贝构造器,
有个东西叫做拷贝构造器,百度一下“拷贝构造函数”。
35_avatar_middle
最佳答案
0 
在线会员 发表于 2021-1-26 11:24:52 | 显示全部楼层
cpp2019 发表于 2021-1-25 17:52
怪我上次回帖没说完!
类内部有操作指针分配内存空间等操作,则必须写拷贝构造器,
有个东西叫做拷贝 ...

我一般是弄弄算法,不怎么弄纯C++类,确实生疏了。谢谢提醒。
31_avatar_middle
最佳答案
8 
在线会员 发表于 2021-1-26 14:31:05 | 显示全部楼层
人走茶不凉 发表于 2021-1-26 11:24
我一般是弄弄算法,不怎么弄纯C++类,确实生疏了。谢谢提醒。

正常现象,不可能什么都记得,用到时再查。
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2021-2-28 06:17

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表