作者youtuuube000 (小孩)
看板C_and_CPP
标题[问题] 有关malloc跟一般变数宣告的差别
时间Fri Nov 11 18:30:50 2016
开发平台(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里面却不用释放记忆体呢?
先谢谢回答了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.233.115.107
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1478860252.A.6B3.html
1F:→ MOONRAKER: 因为他们放的记忆体区段不一样 11/11 18:34
2F:→ MOONRAKER: 我也很好奇为何我租车一定要还给别人 而骑我自己的车却 11/11 18:37
3F:→ MOONRAKER: 不用还给自己 这很不对等不是吗 11/11 18:37
4F:→ youtuuube000: 请问Malloc是放在heap 一般变数放在哪呢? 11/11 18:39
5F:→ youtuuube000: 为什麽放在heap要释放记忆体但一般变数的地方却不用 11/11 18:40
6F:→ youtuuube000: 呢? 11/11 18:40
7F:推 CoNsTaR: 因为一般变数用到的大小在编译时期就决定了 11/11 18:41
8F:→ CoNsTaR: 你自己 alloc 的空间是 runtime 才决定 所以也要 runtime 11/11 18:41
9F:→ CoNsTaR: 决定如何释放 11/11 18:41
10F:→ CoNsTaR: 其实有些语言你自己 alloc 的空间也可以在编译时期决定如 11/11 18:43
不好意思在请问一下@@
为什麽会在runtime才决定如何释放呢?
我知道malloc是在runtime才分配记忆体给他
且int a=0;跟malloc在main里面都一样占有记忆体
但为何不用在意int a=0;所占的记忆体空间
而malloc会一定要强调用free呢?
不是程式结束後就自动free掉此程式所用的记忆体空间了吗?
11F:→ CoNsTaR: 何释放 11/11 18:43
12F:→ pttworld: 有个网站是stack overflow 11/11 18:43
我知道有那网站 只是英文不好不知道关建字怎麽下
试了好几次都查不到我想找的答案才来这里发问
但我并不是完全没想过直接问问问题的
若这样还不能在这发问不是很奇怪吗?
13F:→ CoNsTaR: 不需要消化 runtime 的执行成本 像是 Rust 的 Ownership 11/11 18:44
※ 编辑: youtuuube000 (36.233.115.107), 11/11/2016 19:23:03
14F:推 CoNsTaR: 就像有时候你会想要用阵列,用 index 来决定操作哪个变 11/11 19:35
15F:→ CoNsTaR: 数 11/11 19:35
16F:→ CoNsTaR: 这是「程式化」的操作变数,只不过你现在的 case 变成程 11/11 19:35
17F:→ CoNsTaR: 式化的分配记忆体而已 11/11 19:35
18F:→ CoNsTaR: 你有一个规则,用来分配/释放记忆体的规则,或是操作变 11/11 19:37
19F:→ CoNsTaR: 数的规则,而不直接写死在程式里,可以在 runtime 按照规 11/11 19:37
20F:→ CoNsTaR: 则做 11/11 19:37
21F:→ CoNsTaR: 至於 Rust 就是已经把规则定好在语言里面了,达成程式设 11/11 19:39
22F:→ CoNsTaR: 计师和编译器之间的共识 11/11 19:39
23F:→ pttworld: 刻意断字的明显提示怎麽。关键字:stack and heap 11/11 19:40
24F:推 CoNsTaR: 这样说好了 变数不用(或说 life time 结束比较精确)的时 11/11 19:52
25F:→ CoNsTaR: 候就该被释放 11/11 19:52
26F:→ CoNsTaR: 这是语言的规定,让你不用多考虑哪个变数该在哪释放 11/11 19:52
27F:→ CoNsTaR: 当然也有一个让你自己决定如何释放的机制,那就是 malloc 11/11 19:52
我大概懂了 谢谢你!
※ 编辑: youtuuube000 (36.233.115.107), 11/11/2016 20:00:59
28F:→ james732: 其实也不应该在main里放一堆变数XD 11/11 20:29
29F:推 Bencrie: gcc -S 去看输出的组语应该会有帮助 11/12 01:54
30F:→ MOONRAKER: 你有想过你的变数要在runtime的什麽时候释放吗 11/12 04:54
31F:→ MOONRAKER: 没有 因为你只想到你自己 11/12 04:54
32F:→ MOONRAKER: 你没有想过或你想不到 不表示这个设计没有意义 11/12 04:55
33F:推 b0920075: pttworld大大把stack overflow分超开就是提醒你跟stack 11/12 16:10
34F:→ b0920075: 有关吧XDDDD 11/12 16:10
35F:→ Ommm5566: 原理跟C大说得不太一样=.= 11/13 07:05
36F:推 ronin728: 作业系统不帮你做 garbage collection,可能是因为在OS 11/15 10:07
37F:→ ronin728: 层级做GC效果很差。没GC的情况下,你不 free ,那麽OS怎 11/15 10:07
38F:→ ronin728: 麽知道你用的哪块记忆体有还回来? 自己的垃圾自己清 11/15 10:07