作者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/m.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