VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 546|回复: 14

[已解决]释放堆内存的疑惑

[复制链接]
46_avatar_middle
最佳答案
4 
在线会员 发表于 2022-2-13 22:29:07 | 显示全部楼层 |阅读模式
curr节点是在堆中创建的,free(curr)后,堆内存被回收,
return data 指针,这个没有意义啊,我错在哪儿了?
最佳答案
90_avatar_small
2022-2-16 20:19:55
CIA 发表于 2022-2-14 05:43
我知道data是在堆中创建的,但是在return data指针之前,不是用free(curr)把data的内存回收了吗?
你在 ...

先赋值 后释放的
捕获.PNG




上一篇:如何用C++语言获取游戏的16进制数窗口句柄
下一篇:SetItemText的问题
90_avatar_middle
最佳答案
1 
在线会员 发表于 2022-2-14 00:24:40 | 显示全部楼层
data也是在堆中创建的啊,如果是普通变量是栈中创建,返回没有意义的!
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-14 05:43:10 | 显示全部楼层
花木成畦手自栽a 发表于 2022-2-14 00:24
data也是在堆中创建的啊,如果是普通变量是栈中创建,返回没有意义的!

我知道data是在堆中创建的,但是在return data指针之前,不是用free(curr)把data的内存回收了吗?
你在函数外面用变量接收 return data指针,不能用这个指针了啊,因为free(curr)了
60_avatar_middle
最佳答案
0 
在线会员 发表于 2022-2-14 11:29:41 | 显示全部楼层
是编译报错还是不能运行还是运行又报错呢还是说这个费解的代码居然成功运行了啥问题也没有比如返回值很诡异的数呢
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-14 16:35:48 来自手机 | 显示全部楼层
netforfun 发表于 2022-2-14 11:29
是编译报错还是不能运行还是运行又报错呢还是说这个费解的代码居然成功运行了啥问题也没有比如返回值很诡异 ...

无法理解这个代码,还没运行
52_avatar_middle
最佳答案
1 
在线会员 发表于 2022-2-14 21:13:09 | 显示全部楼层
当指针所指对象被释放或收回,但是对该指针没有任何的修改,以至于该指针仍旧指向已经回收的内存,对这种指针操作会使程序发生不可预知的错误!应该在释放后 Pointer = NULL 未初始化的指针称之为 野指针,悬空指针!,另外编你释放后返回译器不知道在的指针操作,是不小心的还是故意的,所以提示
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-14 23:35:25 | 显示全部楼层
VC低调 发表于 2022-2-14 21:13
当指针所指对象被释放或收回,但是对该指针没有任何的修改,以至于该指针仍旧指向已经回收的内存,对这种指 ...

你说的好。我是在学习某个人的数据结构的时候,他的代码是这样写的,但是我有上面的疑问。
具体的地址是:https://lookcos.cn/archives/1137.html
你有兴趣可以看看
07_avatar_middle
最佳答案
11 
在线会员 发表于 2022-2-15 08:48:17 | 显示全部楼层
free只会释放传入的指针而不会调用析构函数。就算你用C++的delete,对于指针形式的结构体成员或成员变量,在没有特意在析构函数里释放的话,delete也不会去释放指针成员所指向的内存。所以,free(curr)释放了当前结点所占用的内存,data中保存的是当前结点的data成员指针所指向的内存,返回data指针是正确的。
98_avatar_middle
最佳答案
0 
在线会员 发表于 2022-2-15 12:07:06 | 显示全部楼层
作者不请自来,我来回答一下你的疑问(并不复杂):
首先这是一个用于出栈的函数,既然是出栈,肯定是要返回栈顶元素的。
由于栈中的元素,类型是万能的,所以返回一个void *类型的指针。
而free(curr)与return data,并不矛盾。你可以看看这个系列教程的前三篇,帮助你理解指针和内存。
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-16 00:36:06 | 显示全部楼层
freehawkzk 发表于 2022-2-15 08:48
free只会释放传入的指针而不会调用析构函数。就算你用C++的delete,对于指针形式的结构体成员或成员变量, ...

那要是后面没有使用data指针指向的内存,那这块内存岂不是成了孤魂野鬼
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-16 00:37:39 | 显示全部楼层
lookcos 发表于 2022-2-15 12:07
作者不请自来,我来回答一下你的疑问(并不复杂):
首先这是一个用于出栈的函数,既然是出栈,肯定是要返 ...

我找时间好好读读
60_avatar_middle
最佳答案
0 
在线会员 发表于 2022-2-16 09:30:08 | 显示全部楼层
CIA 发表于 2022-2-16 00:36
那要是后面没有使用data指针指向的内存,那这块内存岂不是成了孤魂野鬼

栈是栈,数据是数据,把栈、队列、链表、图等容器当作目录就比较好理解了,一般合理的架构中数据都要单独进行维护,因为数据不一定会放栈里也可能会放在其他容器里,至于会不会有指针或数据成孤魂野鬼要看数据到底有没有考虑好分配和删除。
90_avatar_middle
最佳答案
1 
在线会员 发表于 2022-2-16 20:19:55 | 显示全部楼层    本楼为最佳答案   
bestAnswer
CIA 发表于 2022-2-14 05:43
我知道data是在堆中创建的,但是在return data指针之前,不是用free(curr)把data的内存回收了吗?
你在 ...

先赋值 后释放的
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-18 12:12:28 | 显示全部楼层
lookcos 发表于 2022-2-15 12:07
作者不请自来,我来回答一下你的疑问(并不复杂):
首先这是一个用于出栈的函数,既然是出栈,肯定是要返 ...

我好像看明白了
return data 返回的是局部变量的指针:
这个愿意在哪,有什么副作用吗?
46_avatar_middle
最佳答案
4 
ico_lz  楼主| 发表于 2022-2-19 06:59:40 | 显示全部楼层
lookcos 发表于 2022-2-15 12:07
作者不请自来,我来回答一下你的疑问(并不复杂):
首先这是一个用于出栈的函数,既然是出栈,肯定是要返 ...

今天跟着实现了队列,还依据自己的想法,作了些许修改,但是结果是一样的
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

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

关闭

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

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

GMT+8, 2022-5-18 17:31

Powered by CcTry.CoM

© 2009-2021 cctry.com

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