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

看板C_and_CPP (C/C++)作者 (LOL)時間9年前 (2016/11/12 14:36), 9年前編輯推噓6(8239)
留言49則, 11人參與, 最新討論串2/3 (看更多)
※ 引述《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://www.ptt.cc/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

11/12 14:51, , 1F
..
11/12 14:51, 1F

11/12 14:56, , 2F
最後一段怎麼怪怪的,Ring3下應該是隨著程式結束清掉
11/12 14:56, 2F

11/12 14:57, , 3F
Ring0的話好像是會一直佔著記憶體
11/12 14:57, 3F

11/12 14:59, , 4F
不過寫ring0的程式大概不會通過簡單的malloc來申請
11/12 14:59, 4F

11/12 15:25, , 5F
沒錯,感謝s大的補充
11/12 15:25, 5F

11/12 15:47, , 6F
針對原po最後一段的疑問,我看看以下這樣解釋o不ok
11/12 15:47, 6F

11/12 15:47, , 7F
假設如果在main裡有一個無窮迴圈 不斷的在等事件發生
11/12 15:47, 7F

11/12 15:47, , 8F
而事件發生時,我們會用malloc配置記憶體空間
11/12 15:47, 8F

11/12 15:47, , 9F
當時間越來越長,malloc的空間越來越多
11/12 15:47, 9F

11/12 15:47, , 10F
但卻沒有對應的free來釋放空間,最後空間就耗光了
11/12 15:47, 10F

11/12 15:48, , 11F
因此就算是main裡使用malloc,還是必須要free
11/12 15:48, 11F

11/12 15:48, , 12F
而int a=0是不會一直被配置空間的
11/12 15:48, 12F

11/13 07:04, , 13F
不是資料結構吧? heap和stack是系統的
11/13 07:04, 13F

11/13 07:04, , 14F
資結的heap stack意義完全不一樣
11/13 07:04, 14F

11/13 19:32, , 15F
一直很好奇沒有free掉的記憶體,系統不會接管釋放嗎~
11/13 19:32, 15F

11/13 19:37, , 16F
換個說法~windwos會允許沒寫好的程式浪費空間嗎~
11/13 19:37, 16F

11/13 20:00, , 17F
為什麼要強調 windows...正常來說系統是會在程式結束
11/13 20:00, 17F

11/13 20:00, , 18F
後釋放掉的 但是程式還在執行中就不會去動它
11/13 20:00, 18F

11/13 20:20, , 19F
也不一定是win啦~linux MAC也好
11/13 20:20, 19F

11/13 20:21, , 20F
記得好像聽老師說過,就算沒free() 系統也會接管釋放
11/13 20:21, 20F

11/13 20:22, , 21F
不過沒 free() 挖坑給自己跳很容易出找不到的bug
11/13 20:22, 21F

11/14 00:39, , 22F
你的觀念很有問題...
11/14 00:39, 22F

11/14 12:44, , 23F
自己國家自己救...自己生的記憶體自己清
11/14 12:44, 23F

11/14 15:20, , 24F
最後一段全錯....
11/14 15:20, 24F

11/14 15:57, , 25F
了解。也不是很確定,片段聽過
11/14 15:57, 25F

11/14 15:58, , 26F
最後那段也是先前看過的,給的自己挖了坑QQ
11/14 15:58, 26F

11/14 17:32, , 27F
malloc的變數在程式結束時是否歸還 要看OS的行為
11/14 17:32, 27F

11/14 17:32, , 28F
如果OS不幫你處理 那麼就不會歸還
11/14 17:32, 28F

11/14 18:19, , 29F
好的~
11/14 18:19, 29F

11/14 22:29, , 30F
抱歉喔,最後一段的確錯了,process起來時,配置的空
11/14 22:29, 30F

11/14 22:29, , 31F
間包含stack跟heap,還有一些其他的global空間等等
11/14 22:29, 31F

11/14 22:30, , 32F
所以當process結束後,heap也會釋放掉
11/14 22:30, 32F

11/14 22:30, , 33F
不過我不懂Ommm5566大說的系統跟資料結構的stack跟
11/14 22:30, 33F

11/14 22:31, , 34F
heap是不同的,應該是一樣的東西啊
11/14 22:31, 34F

11/14 22:39, , 35F
OS裏面有heap,stack 資結也有heap,stack的確是再講不同的
11/14 22:39, 35F

11/14 22:41, , 36F
事沒錯~我覺得你可能OS比較不熟?可以去瞭解一下OS的
11/14 22:41, 36F

11/14 22:42, , 37F
heap,stack定義跟實際用法,只看書還不夠
11/14 22:42, 37F

11/14 22:59, , 38F
os的heap跟stack是資料放在記憶體的資料結構啊?
11/14 22:59, 38F

11/14 22:59, , 39F
就是用資料結構講的概念的實作
11/14 22:59, 39F

11/14 23:00, , 40F
所以呼叫function時,會push進stack
11/14 23:00, 40F

11/14 23:01, , 41F
return時,會pop出來結果
11/14 23:01, 41F

11/15 06:57, , 42F
此heap非彼heap
11/15 06:57, 42F

11/15 06:58, , 43F
只是名稱一樣
11/15 06:58, 43F

11/15 06:58, , 44F
我mallo每次空間都不一樣 你heap sort給我看
11/15 06:58, 44F

11/15 09:21, , 45F
main 函數不一定是第一個被呼叫的函數...
11/15 09:21, 45F

11/15 09:39, , 46F
建議你去讀一下OS的書,通常都是在 virtual address spa
11/15 09:39, 46F

11/15 09:40, , 47F
ce 弄出 page,然後用特定的演算法管理,例如 Linux 的
11/15 09:40, 47F

11/15 09:40, , 48F
Buddy、Slab 演算法,Buddy 演算法確實有一點DS的 Heap
11/15 09:40, 48F

11/15 09:40, , 49F
的感覺,但只用 free list 線性找到底... 其實也叫 heap
11/15 09:40, 49F
文章代碼(AID): #1O9hY0VX (C_and_CPP)
文章代碼(AID): #1O9hY0VX (C_and_CPP)