※ 引述《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..
最后一段怎么怪怪的,Ring3下应该是随着程式结束清掉Ring0的话好像是会一直占著内存不过写ring0的程式大概不会通过简单的malloc来申请
没错,感谢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你的观念很有问题...
作者:
hunandy14 (Charlott.HonG)
2016-11-14 15:57:00了解。也不是很确定,片段听过最后那段也是先前看过的,给的自己挖了坑QQ
malloc的变量在程式结束时是否归还 要看OS的行为如果OS不帮你处理 那么就不会归还
作者:
hunandy14 (Charlott.HonG)
2016-11-14 18:19:00好的~
抱歉喔,最后一段的确错了,process起来时,配置的空间包含stack跟heap,还有一些其他的global空间等等所以当process结束后,heap也会释放掉不过我不懂Ommm5566大说的系统跟资料结构的stack跟heap是不同的,应该是一样的东西啊
作者:
final01 (牛顿运动定律)
2016-11-14 22:39:00OS里面有heap,stack 资结也有heap,stack的确是再讲不同的事没错~我觉得你可能OS比较不熟?可以去了解一下OS的heap,stack定义跟实际用法,只看书还不够
os的heap跟stack是资料放在内存的资料结构啊?就是用资料结构讲的概念的实作所以呼叫function时,会push进stackreturn时,会pop出来结果
此heap非彼heap只是名称一样我mallo每次空间都不一样 你heap sort给我看
main 函数不一定是第一个被呼叫的函数...建议你去读一下OS的书,通常都是在 virtual address space 弄出 page,然后用特定的算法管理,例如 Linux 的Buddy、Slab 算法,Buddy 算法确实有一点DS的 Heap的感觉,但只用 free list 线性找到底... 其实也叫 heap