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

楼主: youtuuube000 (小孩)   2016-11-11 18:30:50
开发平台(Platform): (Ex: Win10, Linux, ...)
linux
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
无吧(?
问题(Question):
各位好
我想要问一下
若在一般function宣告变量的话(e.q. int a=0;)
我知道随着function结束执行return后 变量的内存也就会被释放了
但若是在main里面宣告的话
此变量不就会一直保留着他的内存
而要等到程式结束后他才会被清空吗?
但为什么一般都没有设计清空在main里面宣告变量内存的机制呢?
但malloc却一定要强调要用free来清空呢?
malloc宣告的变量不也会随着程式结束后就被清空了吗?
为什么要强调一定要用free呢?
我知道在其他function定义的malloc一定要用free不然会有memory leak
但在main里面宣告的malloc的变量都要强调要用free
为什么int a=0;在main里面却不用释放内存呢?
先谢谢回答了
作者: MOONRAKER (㊣牛鹤鳗毛人)   2016-11-11 18:34:00
因为他们放的内存区段不一样我也很好奇为何我租车一定要还给别人 而骑我自己的车却不用还给自己 这很不对等不是吗
楼主: youtuuube000 (小孩)   2016-11-11 18:39:00
请问Malloc是放在heap 一般变量放在哪呢?为什么放在heap要释放内存但一般变量的地方却不用呢?
作者: CoNsTaR ((const *))   2016-11-11 18:41:00
因为一般变量用到的大小在编译时期就决定了你自己 alloc 的空间是 runtime 才决定 所以也要 runtime决定如何释放其实有些语言你自己 alloc 的空间也可以在编译时期决定如何释放
作者: pttworld (批踢踢世界)   2016-11-11 18:43:00
有个网站是stack overflow
作者: CoNsTaR ((const *))   2016-11-11 18:44:00
不需要消化 runtime 的执行成本 像是 Rust 的 Ownership就像有时候你会想要用阵列,用 index 来决定操作哪个变量这是“程式化”的操作变量,只不过你现在的 case 变成程式化的分配内存而已你有一个规则,用来分配/释放内存的规则,或是操作变量的规则,而不直接写死在程式里,可以在 runtime 按照规则做至于 Rust 就是已经把规则定好在语言里面了,达成程式设计师和编译器之间的共识
作者: pttworld (批踢踢世界)   2016-11-11 19:40:00
刻意断字的明显提示怎么。关键字:stack and heap
作者: CoNsTaR ((const *))   2016-11-11 19:52:00
这样说好了 变量不用(或说 life time 结束比较精确)的时候就该被释放这是语言的规定,让你不用多考虑哪个变量该在哪释放当然也有一个让你自己决定如何释放的机制,那就是 malloc
作者: james732 (好人超)   2016-11-11 20:29:00
其实也不应该在main里放一堆变量XD
作者: Bencrie   2016-11-12 01:54:00
gcc -S 去看输出的组语应该会有帮助
作者: MOONRAKER (㊣牛鹤鳗毛人)   2016-11-12 04:54:00
你有想过你的变量要在runtime的什么时候释放吗没有 因为你只想到你自己你没有想过或你想不到 不表示这个设计没有意义
作者: b0920075 (Void)   2016-11-12 16:10:00
pttworld大大把stack overflow分超开就是提醒你跟stack有关吧XDDDD
作者: Ommm5566 (56天團)   2016-11-13 07:05:00
原理跟C大说得不太一样=.=
作者: ronin728 (浪人)   2016-11-15 10:07:00
作业系统不帮你做 garbage collection,可能是因为在OS层级做GC效果很差。没GC的情况下,你不 free ,那么OS怎么知道你用的哪块内存有还回来? 自己的垃圾自己清

Links booklink

Contact Us: admin [ a t ] ucptt.com