[討論] 大家對C語言中 free() 的看法?

作者: Hazukashiine (私は幸せです)   2015-06-14 14:40:16
許多教程式的教授或是工程師會認為一個好的程式中 free() 與 *alloc() 必須成對。
通常執行 free() 並不會把 memory 還給 operating system,
反而是告訴程式,下一次 *alloc() 的時候,可以用一下之前 free() 過的空間。
這種設計並不壞,主要是為了節省 system call 的時間消耗。
雖然心中覺得成對會比較嚴謹一點,不過在實作的時候確實會容易造成問題。
問題一:
前一個人 free() 掉之後,並沒有把指標設成 NULL,然後還在 code 中到處流串,
只要一不小心,*** glibc detected *** double free or corruption 就會死給你看,
這種 bug 最噁心了,尤其在其他 code 不是你寫的時候。
問題二:
當一個函數的回傳值是一個指向空間的指標的時候,
而且這個函數會將這個指標送給超過一個的函數的話,
只要其中一個函數 free() 掉之後,其他的函數也會跟著遭殃,
通常會送個 Segmentation fault (core dumped) 當作聖誕節禮物。
程式在結束的時候,大部分的作業系統都會回收記憶體,
所以,若在程式碼結尾的地方 free() 掉所有申請過的空間,也是多此一舉。
我的看法是,若該指標出現在迴圈中或是遞迴中的話,才有使用 free() 的必要,
其餘的指標就讓作業系統去回收吧,畢竟通常吃記憶體的怪獸都是迴圈或遞迴中的指標。
大家怎麼看?通常都會嚴格遵守成對的習慣嗎?
作者: LiloHuang (十年一刻)   2015-06-14 14:46:00
還好我寫 C++ 我用 smart pointer (boost::shared_ptr)倒是看過不少人會定義一個 SAFE_FREE macro 來設 NULL至於 free 會不會真的還給作業系統要看 C-Runtime 實作glibc 可以用 malloc_stats() 來看有沒有還回去至於 MSVCRT 的話,我沒記錯 free 每次都還回去就是 :)
作者: chchwy (mat)   2015-06-14 14:57:00
你當記憶體用不完阿 不還很快就沒了
作者: azureblaze (AzureBlaze)   2015-06-14 15:09:00
不free你也只是把問題晾在那邊沒解決啊
作者: kevingwn (如雲如風的人生)   2015-06-14 15:09:00
問題1&2的癥結都在於:不要free()不是你*alloc()出來的指標,例如某DLL是用gcc編譯,你在MSVC的程式去free()它的指標會有不可預期的結果問題3:遵守成對是寫C的基本,對此有疑慮建議改用有垃圾回收機制的語言
作者: uranusjr (←這人是超級笨蛋)   2015-06-14 15:12:00
兩個問題都是因為沒有正確讓它們成對, 成對本身沒有問題
作者: bibo9901 (function(){})()   2015-06-14 15:40:00
推樓上
作者: Qbsuran (Qbsuran)   2015-06-14 15:59:00
照這樣想法如果去寫infinity loop 很快就會掛掉 不是所有程式都要結束
作者: suhorng ( )   2015-06-14 16:23:00
可是迴圈很多耶, 像是跑不停的伺服器程式不能一直不 free 下去呀一次性跑一下就沒了的程式就算了
作者: azureblaze (AzureBlaze)   2015-06-14 16:33:00
要求使用著自己弄一塊記憶體給你寫或是用alloc_str() free_str()給使用者就像fopen和fclose也得成對這是一定得處理的問題,等程式結束絕對不是解決方案
作者: kevingwn (如雲如風的人生)   2015-06-14 17:38:00
這種情況free()的責任在Mr.A而不在B,通常A要提供另一個函式給B,B應該呼叫該函式讓A有機會free(),而不是直接使用free() 因為A&B可能經不同的編譯後才連結兩者的malloc及free來自不同的c runtime,混用將造成不可預期的結果若一起編譯的話當然沒問題,但結果是A&B這對CP不可拆不可逆XD不是良好的設計
作者: ah7675 (阿毛)   2015-06-14 23:35:00
你是不是沒修過作業系統@@?
作者: Killercat (殺人貓™)   2015-06-15 18:26:00
現代OS多半都能回收,但是這並沒有保證我個人會建議記得的話還是寫一下
作者: cobrasgo (人魚線變成鮪魚線,超帥)   2015-06-16 18:30:00
c不只用在pc上,在mcu上這樣搞就死定了
作者: Killercat (殺人貓™)   2015-06-17 17:56:00
應該說 在非保護模式的OS上 一定死 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com