C语言释放内存空间

「已注销」 2020-02-15 06:14:46
我想用某个函数释放掉malloc等函数申请的堆空间,但只需要释放掉一部分,显然free是不行了,无论是释放前几个还是释放从某个位置开始到最后都做不到,memset可以重置,但这块内存应该还是被程序占用吧,请教有没有别的办法
...全文
275 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2020-02-16
  • 打赏
  • 举报
回复
引用 9 楼 真相重于对错的回复:
就算自己设计内存池,我觉得也不应该提供这个功能。建议百度一下动态内存分配算法。
好的,感谢帮助(又要十个字
「已注销」 2020-02-16
  • 打赏
  • 举报
回复
引用 8 楼 真相重于对错的回复:
另外你可能认为这样做会更省内存。 但实际上并不如此。前面我已经说malloc返回的是一段连续的内存。你应该知道内存碎片的概念。例如你malloc了100k的内存,如果系统中只剩下两块80k,你也会malloc失败。 那么如果允许从中间释放,原来的连续的内存,将非常容易变成碎片。
这倒是,碎片和占着茅坑不拉屎说不上一定哪个好,如果malloc多次,如果他们正好连续,我要free掉一个岂不也是中断了,如果不是连续的,那本身就那样了,从这方面来说,我不过相当于malloc了三段连续的小空间,抽走中间的罢了,我还是想说如果真有这么一个函数,他只是一个工具,能起多大作用,还是得看人怎么用了,如果开了一个大空间却因为一点点数据无法释放显然是得不偿失的,当然这种情况下把剩下的一部分拷贝,释放掉原空间也可以,但这样很可能会波及到前面用的到部分指针,当然这也可以人工避免。所以说了这么久不过是想捡个现成的工具而已,用不用怎么用,见仁见智而已
真相重于对错 2020-02-16
  • 打赏
  • 举报
回复
就算自己设计内存池,我觉得也不应该提供这个功能。建议百度一下动态内存分配算法。
真相重于对错 2020-02-16
  • 打赏
  • 举报
回复
另外你可能认为这样做会更省内存。 但实际上并不如此。前面我已经说malloc返回的是一段连续的内存。你应该知道内存碎片的概念。例如你malloc了100k的内存,如果系统中只剩下两块80k,你也会malloc失败。 那么如果允许从中间释放,原来的连续的内存,将非常容易变成碎片。
「已注销」 2020-02-16
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错的回复:
[quote=引用 5 楼 與蘤舊縐 的回复:] [quote=引用 4 楼 真相重于对错的回复:]想一下,为什么要这么做,这么做的目的是什么? 如果这么做可以,带来的后果是什么?
后果不后果得看这函数具体的限制,还得看你怎么用了,如果足够信任程序员的话就可以给这个权限[/quote] 这不是信不信任程序员的问题。而是系统如何设计的问题。malloc是返回一段内存的首地址,free的参数是一段地址的首地址。那么可以推论堆内存的管理应该是一个表,表的每一项是标记已经用的内存。包括它的地址和长度,如果允许把一段已开的内存中间某段释放掉,那么就要修改整个的表,效率会怎样?而且如果删除中间一段,本来malloc/free只要记住首地址即可,现在还要记住下一段的地址。否则最后无法完全释放。[/quote] 我是觉得还是安全方面的问题比较麻烦,具体实现虽然不知如何才能高效,但至少不必记这么多,或者说记住空间首地址和长度即可,如果搜索起来麻烦,大可设置形参为原地址加起始位置,虽然在程序的不同位置可能无法获取到原指针,但既然是要指定删除的,自然知道起始位置到原指针的距离,原指针可能,如果中断那就是一段变两段,多一组数据,也不至于改了整个表吧,而且一开始判断该地址是否存在应当已经找到该内存在表中的位置不管需不需要再重找,都容易得多,再者要实现这个效果不一定非得改底层,就像一楼说的搞个内存池也行,不过一般的内存池显然是不好使的,最后呢这不过是扩展一个功能,用不用程序员说了算,考虑空间与时间,在必要的情况下未必不可拿时间换空间
真相重于对错 2020-02-16
  • 打赏
  • 举报
回复
引用 5 楼 與蘤舊縐 的回复:
[quote=引用 4 楼 真相重于对错的回复:]想一下,为什么要这么做,这么做的目的是什么? 如果这么做可以,带来的后果是什么?
后果不后果得看这函数具体的限制,还得看你怎么用了,如果足够信任程序员的话就可以给这个权限[/quote] 这不是信不信任程序员的问题。而是系统如何设计的问题。malloc是返回一段内存的首地址,free的参数是一段地址的首地址。那么可以推论堆内存的管理应该是一个表,表的每一项是标记已经用的内存。包括它的地址和长度,如果允许把一段已开的内存中间某段释放掉,那么就要修改整个的表,效率会怎样?而且如果删除中间一段,本来malloc/free只要记住首地址即可,现在还要记住下一段的地址。否则最后无法完全释放。
「已注销」 2020-02-16
  • 打赏
  • 举报
回复
引用 4 楼 真相重于对错的回复:
想一下,为什么要这么做,这么做的目的是什么? 如果这么做可以,带来的后果是什么?
后果不后果得看这函数具体的限制,还得看你怎么用了,如果足够信任程序员的话就可以给这个权限
真相重于对错 2020-02-16
  • 打赏
  • 举报
回复
想一下,为什么要这么做,这么做的目的是什么? 如果这么做可以,带来的后果是什么?
「已注销」 2020-02-15
  • 打赏
  • 举报
回复
引用 1 楼 apkipa1的回复:
简单来说:洗洗睡吧。 具体来说:操作系统本身就对用户态内存分配有限制,所有内存页都是操作系统管的,用户态管不着。再加上 C 运行库可能对从系统那获得的内存再做其它管理,最后指针才到用户代码那里,用户代码真的没什么好做的。(不过 C 提供了 realloc,可能可以满足你的部分需求,实在不行就写个内存池自娱自乐好了)
注意/主要 这APP怎么撤不回来
「已注销」 2020-02-15
  • 打赏
  • 举报
回复
引用 1 楼 apkipa1的回复:
简单来说:洗洗睡吧。 具体来说:操作系统本身就对用户态内存分配有限制,所有内存页都是操作系统管的,用户态管不着。再加上 C 运行库可能对从系统那获得的内存再做其它管理,最后指针才到用户代码那里,用户代码真的没什么好做的。(不过 C 提供了 realloc,可能可以满足你的部分需求,实在不行就写个内存池自娱自乐好了)
注意是想用来释放掉一个指向已申请内存中段的指针指向的之后的内存,realloc也是不行的,自己写是没问题,只是用起来麻烦,图个现成的,看来是没有了
apkipa1 2020-02-15
  • 打赏
  • 举报
回复
简单来说:洗洗睡吧。 具体来说:操作系统本身就对用户态内存分配有限制,所有内存页都是操作系统管的,用户态管不着。再加上 C 运行库可能对从系统那获得的内存再做其它管理,最后指针才到用户代码那里,用户代码真的没什么好做的。(不过 C 提供了 realloc,可能可以满足你的部分需求,实在不行就写个内存池自娱自乐好了)

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧