Re: [问题] 有关malloc跟一般变量宣告的差别

楼主: LoserOfLove (LOL)   2016-11-12 14:36:46
※ 引述《youtuuube000 (小孩)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: linux
: 编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
: GCC
: 额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
: 无吧(?
: 问题(Question):
: 各位好
: 我想要问一下
: 若在一般function宣告变量的话(e.q. int a=0;)
: 我知道随着function结束执行return后 变量的内存也就会被释放了
这是因为function被呼叫时,这些变量会被push到stack里
而return后,则会被pop出来,也就是你所说的被释放
: 但若是在main里面宣告的话
: 此变量不就会一直保留着他的内存
: 而要等到程式结束后他才会被清空吗?
是的,这是因为main本身也是一个function
只是他是第一个被呼叫的function
所以他最后才被pop,也就是你所说的程式结束
这是stack的特性,先进后出
: 但为什么一般都没有设计清空在main里面宣告变量内存的机制呢?
会清空啊
同上所述,因为main是function,当他被return时
所有宣告的变量就会被pop出来
: 但malloc却一定要强调要用free来清空呢?
: malloc宣告的变量不也会随着程式结束后就被清空了吗?
: 为什么要强调一定要用free呢?
不是喔,malloc的变量不会随着程式结束被清掉
如果没有free掉,他会一直占著内存,直到你重开机
而malloc的变量存放的地方称作heap
建议你找本资料结构的书,看一下什么是stack跟heap
就会有概念了
: 我知道在其他function定义的malloc一定要用free不然会有memory leak
: 但在main里面宣告的malloc的变量都要强调要用free
: 为什么int a=0;在main里面却不用释放内存呢?
: 先谢谢回答了
作者: CoNsTaR ((const *))   2016-11-12 14:51:00
..
作者: stupid0319 (征女友)   2016-11-12 14:56:00
最后一段怎么怪怪的,Ring3下应该是随着程式结束清掉Ring0的话好像是会一直占著内存不过写ring0的程式大概不会通过简单的malloc来申请
楼主: LoserOfLove (LOL)   2016-11-12 15:25:00
没错,感谢s大的补充针对原po最后一段的疑问,我看看以下这样解释o不ok假设如果在main里有一个无穷循环 不断的在等事件发生而事件发生时,我们会用malloc配置内存空间当时间越来越长,malloc的空间越来越多但却没有对应的free来释放空间,最后空间就耗光了因此就算是main里使用malloc,还是必须要free而int a=0是不会一直被配置空间的
作者: Ommm5566 (56天團)   2016-11-13 07:04:00
不是资料结构吧? heap和stack是系统的资结的heap stack意义完全不一样
作者: hunandy14 (Charlott.HonG)   2016-11-13 19:32:00
一直很好奇没有free掉的内存,系统不会接管释放吗~换个说法~windwos会允许没写好的程式浪费空间吗~
作者: s25g5d4 (function(){})()   2016-11-13 20:00:00
为什么要强调 windows...正常来说系统是会在程式结束后释放掉的 但是程式还在执行中就不会去动它
作者: hunandy14 (Charlott.HonG)   2016-11-13 20:20:00
也不一定是win啦~linux MAC也好记得好像听老师说过,就算没free() 系统也会接管释放不过没 free() 挖坑给自己跳很容易出找不到的bug
作者: final01 (牛顿运动定律)   2016-11-14 00:39:00
你的观念很有问题...
作者: Raymond0710 (雷门)   2016-11-14 12:44:00
自己国家自己救...自己生的内存自己清
作者: Sidney0503 (Sidney0503)   2016-11-14 15:20:00
最后一段全错....
作者: hunandy14 (Charlott.HonG)   2016-11-14 15:57:00
了解。也不是很确定,片段听过最后那段也是先前看过的,给的自己挖了坑QQ
作者: redmilk   2016-11-14 17:32:00
malloc的变量在程式结束时是否归还 要看OS的行为如果OS不帮你处理 那么就不会归还
作者: hunandy14 (Charlott.HonG)   2016-11-14 18:19:00
好的~
楼主: LoserOfLove (LOL)   2016-11-14 22:29:00
抱歉喔,最后一段的确错了,process起来时,配置的空间包含stack跟heap,还有一些其他的global空间等等所以当process结束后,heap也会释放掉不过我不懂Ommm5566大说的系统跟资料结构的stack跟heap是不同的,应该是一样的东西啊
作者: final01 (牛顿运动定律)   2016-11-14 22:39:00
OS里面有heap,stack 资结也有heap,stack的确是再讲不同的事没错~我觉得你可能OS比较不熟?可以去了解一下OS的heap,stack定义跟实际用法,只看书还不够
楼主: LoserOfLove (LOL)   2016-11-14 22:59:00
os的heap跟stack是资料放在内存的资料结构啊?就是用资料结构讲的概念的实作所以呼叫function时,会push进stackreturn时,会pop出来结果
作者: Sidney0503 (Sidney0503)   2016-11-15 06:57:00
此heap非彼heap只是名称一样我mallo每次空间都不一样 你heap sort给我看
作者: ronin728 (浪人)   2016-11-15 09:21:00
main 函数不一定是第一个被呼叫的函数...建议你去读一下OS的书,通常都是在 virtual address space 弄出 page,然后用特定的算法管理,例如 Linux 的Buddy、Slab 算法,Buddy 算法确实有一点DS的 Heap的感觉,但只用 free list 线性找到底... 其实也叫 heap

Links booklink

Contact Us: admin [ a t ] ucptt.com