Re: [問題] 有關malloc跟一般變數宣告的差別

作者: LoserOfLove (LOL)   2016-11-12 14:36:46
※ 引述《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
..
作者: stupid0319 (徵女友)   2016-11-12 14:56:00
最後一段怎麼怪怪的,Ring3下應該是隨著程式結束清掉Ring0的話好像是會一直佔著記憶體不過寫ring0的程式大概不會通過簡單的malloc來申請
作者: LoserOfLove (LOL)   2016-11-12 15:25:00
沒錯,感謝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
你的觀念很有問題...
作者: Raymond0710 (雷門)   2016-11-14 12:44:00
自己國家自己救...自己生的記憶體自己清
作者: Sidney0503 (Sidney0503)   2016-11-14 15:20:00
最後一段全錯....
作者: hunandy14 (Charlott.HonG)   2016-11-14 15:57:00
了解。也不是很確定,片段聽過最後那段也是先前看過的,給的自己挖了坑QQ
作者: redmilk   2016-11-14 17:32:00
malloc的變數在程式結束時是否歸還 要看OS的行為如果OS不幫你處理 那麼就不會歸還
作者: hunandy14 (Charlott.HonG)   2016-11-14 18:19:00
好的~
作者: LoserOfLove (LOL)   2016-11-14 22:29:00
抱歉喔,最後一段的確錯了,process起來時,配置的空間包含stack跟heap,還有一些其他的global空間等等所以當process結束後,heap也會釋放掉不過我不懂Ommm5566大說的系統跟資料結構的stack跟heap是不同的,應該是一樣的東西啊
作者: final01 (牛頓運動定律)   2016-11-14 22:39:00
OS裏面有heap,stack 資結也有heap,stack的確是再講不同的事沒錯~我覺得你可能OS比較不熟?可以去瞭解一下OS的heap,stack定義跟實際用法,只看書還不夠
作者: LoserOfLove (LOL)   2016-11-14 22:59:00
os的heap跟stack是資料放在記憶體的資料結構啊?就是用資料結構講的概念的實作所以呼叫function時,會push進stackreturn時,會pop出來結果
作者: Sidney0503 (Sidney0503)   2016-11-15 06:57:00
此heap非彼heap只是名稱一樣我mallo每次空間都不一樣 你heap sort給我看
作者: ronin728 (浪人)   2016-11-15 09:21:00
main 函數不一定是第一個被呼叫的函數...建議你去讀一下OS的書,通常都是在 virtual address space 弄出 page,然後用特定的演算法管理,例如 Linux 的Buddy、Slab 演算法,Buddy 演算法確實有一點DS的 Heap的感覺,但只用 free list 線性找到底... 其實也叫 heap

Links booklink

Contact Us: admin [ a t ] ucptt.com