作者LoserOfLove (LOL)
看板C_and_CPP
标题Re: [问题] 有关malloc跟一般变数宣告的差别
时间Sat Nov 12 14:36:46 2016
※ 引述《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里面却不用释放记忆体呢?
: 先谢谢回答了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 101.14.150.219
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1478932608.A.7E1.html
※ 编辑: LoserOfLove (101.14.150.219), 11/12/2016 14:39:24
※ 编辑: LoserOfLove (101.14.150.219), 11/12/2016 14:44:16
1F:→ CoNsTaR: .. 11/12 14:51
2F:→ stupid0319: 最後一段怎麽怪怪的,Ring3下应该是随着程式结束清掉 11/12 14:56
3F:→ stupid0319: Ring0的话好像是会一直占着记忆体 11/12 14:57
4F:→ stupid0319: 不过写ring0的程式大概不会通过简单的malloc来申请 11/12 14:59
5F:→ LoserOfLove: 没错,感谢s大的补充 11/12 15:25
6F:→ LoserOfLove: 针对原po最後一段的疑问,我看看以下这样解释o不ok 11/12 15:47
7F:→ LoserOfLove: 假设如果在main里有一个无穷回圈 不断的在等事件发生 11/12 15:47
8F:→ LoserOfLove: 而事件发生时,我们会用malloc配置记忆体空间 11/12 15:47
9F:→ LoserOfLove: 当时间越来越长,malloc的空间越来越多 11/12 15:47
10F:→ LoserOfLove: 但却没有对应的free来释放空间,最後空间就耗光了 11/12 15:47
11F:→ LoserOfLove: 因此就算是main里使用malloc,还是必须要free 11/12 15:48
12F:→ LoserOfLove: 而int a=0是不会一直被配置空间的 11/12 15:48
13F:推 Ommm5566: 不是资料结构吧? heap和stack是系统的 11/13 07:04
14F:→ Ommm5566: 资结的heap stack意义完全不一样 11/13 07:04
15F:→ hunandy14: 一直很好奇没有free掉的记忆体,系统不会接管释放吗~ 11/13 19:32
16F:→ hunandy14: 换个说法~windwos会允许没写好的程式浪费空间吗~ 11/13 19:37
17F:推 s25g5d4: 为什麽要强调 windows...正常来说系统是会在程式结束 11/13 20:00
18F:→ s25g5d4: 後释放掉的 但是程式还在执行中就不会去动它 11/13 20:00
19F:→ hunandy14: 也不一定是win啦~linux MAC也好 11/13 20:20
20F:→ hunandy14: 记得好像听老师说过,就算没free() 系统也会接管释放 11/13 20:21
21F:→ hunandy14: 不过没 free() 挖坑给自己跳很容易出找不到的bug 11/13 20:22
22F:推 final01: 你的观念很有问题... 11/14 00:39
23F:推 Raymond0710: 自己国家自己救...自己生的记忆体自己清 11/14 12:44
24F:嘘 Sidney0503: 最後一段全错.... 11/14 15:20
25F:→ hunandy14: 了解。也不是很确定,片段听过 11/14 15:57
26F:→ hunandy14: 最後那段也是先前看过的,给的自己挖了坑QQ 11/14 15:58
27F:推 redmilk: malloc的变数在程式结束时是否归还 要看OS的行为 11/14 17:32
28F:→ redmilk: 如果OS不帮你处理 那麽就不会归还 11/14 17:32
29F:→ hunandy14: 好的~ 11/14 18:19
30F:→ LoserOfLove: 抱歉喔,最後一段的确错了,process起来时,配置的空 11/14 22:29
31F:→ LoserOfLove: 间包含stack跟heap,还有一些其他的global空间等等 11/14 22:29
32F:→ LoserOfLove: 所以当process结束後,heap也会释放掉 11/14 22:30
33F:→ LoserOfLove: 不过我不懂Ommm5566大说的系统跟资料结构的stack跟 11/14 22:30
34F:→ LoserOfLove: heap是不同的,应该是一样的东西啊 11/14 22:31
35F:推 final01: OS里面有heap,stack 资结也有heap,stack的确是再讲不同的 11/14 22:39
36F:→ final01: 事没错~我觉得你可能OS比较不熟?可以去了解一下OS的 11/14 22:41
37F:→ final01: heap,stack定义跟实际用法,只看书还不够 11/14 22:42
38F:→ LoserOfLove: os的heap跟stack是资料放在记忆体的资料结构啊? 11/14 22:59
39F:→ LoserOfLove: 就是用资料结构讲的概念的实作 11/14 22:59
40F:→ LoserOfLove: 所以呼叫function时,会push进stack 11/14 23:00
41F:→ LoserOfLove: return时,会pop出来结果 11/14 23:01
42F:嘘 Sidney0503: 此heap非彼heap 11/15 06:57
43F:→ Sidney0503: 只是名称一样 11/15 06:58
44F:→ Sidney0503: 我mallo每次空间都不一样 你heap sort给我看 11/15 06:58
45F:推 ronin728: main 函数不一定是第一个被呼叫的函数... 11/15 09:21
46F:推 ronin728: 建议你去读一下OS的书,通常都是在 virtual address spa 11/15 09:39
47F:→ ronin728: ce 弄出 page,然後用特定的演算法管理,例如 Linux 的 11/15 09:40
48F:→ ronin728: Buddy、Slab 演算法,Buddy 演算法确实有一点DS的 Heap 11/15 09:40
49F:→ ronin728: 的感觉,但只用 free list 线性找到底... 其实也叫 heap 11/15 09:40