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

看板C_and_CPP (C/C++)作者 (小孩)時間9年前 (2016/11/11 18:30), 9年前編輯推噓6(6032)
留言38則, 9人參與, 最新討論串1/3 (看更多)
開發平台(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://www.ptt.cc/bbs/C_and_CPP/M.1478860252.A.6B3.html

11/11 18:34, , 1F
因為他們放的記憶體區段不一樣
11/11 18:34, 1F

11/11 18:37, , 2F
我也很好奇為何我租車一定要還給別人 而騎我自己的車卻
11/11 18:37, 2F

11/11 18:37, , 3F
不用還給自己 這很不對等不是嗎
11/11 18:37, 3F

11/11 18:39, , 4F
請問Malloc是放在heap 一般變數放在哪呢?
11/11 18:39, 4F

11/11 18:40, , 5F
為什麼放在heap要釋放記憶體但一般變數的地方卻不用
11/11 18:40, 5F

11/11 18:40, , 6F
呢?
11/11 18:40, 6F

11/11 18:41, , 7F
因為一般變數用到的大小在編譯時期就決定了
11/11 18:41, 7F

11/11 18:41, , 8F
你自己 alloc 的空間是 runtime 才決定 所以也要 runtime
11/11 18:41, 8F

11/11 18:41, , 9F
決定如何釋放
11/11 18:41, 9F

11/11 18:43, , 10F
其實有些語言你自己 alloc 的空間也可以在編譯時期決定如
11/11 18:43, 10F
不好意思在請問一下@@ 為什麼會在runtime才決定如何釋放呢? 我知道malloc是在runtime才分配記憶體給他 且int a=0;跟malloc在main裡面都一樣佔有記憶體 但為何不用在意int a=0;所佔的記憶體空間 而malloc會一定要強調用free呢? 不是程式結束後就自動free掉此程式所用的記憶體空間了嗎?

11/11 18:43, , 11F
何釋放
11/11 18:43, 11F

11/11 18:43, , 12F
有個網站是stack overflow
11/11 18:43, 12F
我知道有那網站 只是英文不好不知道關建字怎麼下 試了好幾次都查不到我想找的答案才來這裡發問 但我並不是完全沒想過直接問問問題的 若這樣還不能在這發問不是很奇怪嗎?

11/11 18:44, , 13F
不需要消化 runtime 的執行成本 像是 Rust 的 Ownership
11/11 18:44, 13F
※ 編輯: youtuuube000 (36.233.115.107), 11/11/2016 19:23:03

11/11 19:35, , 14F
就像有時候你會想要用陣列,用 index 來決定操作哪個變
11/11 19:35, 14F

11/11 19:35, , 15F
11/11 19:35, 15F

11/11 19:35, , 16F
這是「程式化」的操作變數,只不過你現在的 case 變成程
11/11 19:35, 16F

11/11 19:35, , 17F
式化的分配記憶體而已
11/11 19:35, 17F

11/11 19:37, , 18F
你有一個規則,用來分配/釋放記憶體的規則,或是操作變
11/11 19:37, 18F

11/11 19:37, , 19F
數的規則,而不直接寫死在程式裡,可以在 runtime 按照規
11/11 19:37, 19F

11/11 19:37, , 20F
則做
11/11 19:37, 20F

11/11 19:39, , 21F
至於 Rust 就是已經把規則定好在語言裡面了,達成程式設
11/11 19:39, 21F

11/11 19:39, , 22F
計師和編譯器之間的共識
11/11 19:39, 22F

11/11 19:40, , 23F
刻意斷字的明顯提示怎麼。關鍵字:stack and heap
11/11 19:40, 23F

11/11 19:52, , 24F
這樣說好了 變數不用(或說 life time 結束比較精確)的時
11/11 19:52, 24F

11/11 19:52, , 25F
候就該被釋放
11/11 19:52, 25F

11/11 19:52, , 26F
這是語言的規定,讓你不用多考慮哪個變數該在哪釋放
11/11 19:52, 26F

11/11 19:52, , 27F
當然也有一個讓你自己決定如何釋放的機制,那就是 malloc
11/11 19:52, 27F
我大概懂了 謝謝你! ※ 編輯: youtuuube000 (36.233.115.107), 11/11/2016 20:00:59

11/11 20:29, , 28F
其實也不應該在main裡放一堆變數XD
11/11 20:29, 28F

11/12 01:54, , 29F
gcc -S 去看輸出的組語應該會有幫助
11/12 01:54, 29F

11/12 04:54, , 30F
你有想過你的變數要在runtime的什麼時候釋放嗎
11/12 04:54, 30F

11/12 04:54, , 31F
沒有 因為你只想到你自己
11/12 04:54, 31F

11/12 04:55, , 32F
你沒有想過或你想不到 不表示這個設計沒有意義
11/12 04:55, 32F

11/12 16:10, , 33F
pttworld大大把stack overflow分超開就是提醒你跟stack
11/12 16:10, 33F

11/12 16:10, , 34F
有關吧XDDDD
11/12 16:10, 34F

11/13 07:05, , 35F
原理跟C大說得不太一樣=.=
11/13 07:05, 35F

11/15 10:07, , 36F
作業系統不幫你做 garbage collection,可能是因為在OS
11/15 10:07, 36F

11/15 10:07, , 37F
層級做GC效果很差。沒GC的情況下,你不 free ,那麼OS怎
11/15 10:07, 37F

11/15 10:07, , 38F
麼知道你用的哪塊記憶體有還回來? 自己的垃圾自己清
11/15 10:07, 38F
文章代碼(AID): #1O9PtSQp (C_and_CPP)
文章代碼(AID): #1O9PtSQp (C_and_CPP)