[問題] 有關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