3 回答

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
這取決于操作系統(tǒng)。大多數(shù)現(xiàn)代(和所有主要)操作系統(tǒng)將釋放程序結(jié)束時未被程序釋放的內(nèi)存。
依賴于此是不好的做法,最好明確地釋放它。問題不僅在于您的代碼看起來很糟糕。您可能決定將小程序集成到一個較大的,長期運行的程序中。然后一段時間后,你必須花費數(shù)小時追蹤內(nèi)存泄漏。
依賴于操作系統(tǒng)的功能也使代碼不那么便攜。

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
通常,現(xiàn)代通用操作系統(tǒng)在終止進(jìn)程后進(jìn)行清理。這是必要的,因為替代方案是系統(tǒng)隨著時間的推移而丟失資源,并且由于編寫不良的程序或者只是很少發(fā)生泄漏資源的錯誤而需要重新啟動。
無論如何,讓您的程序明確地釋放其資源可能是出于各種原因的良好實踐,例如:
如果您有其他資源在退出時未被操作系統(tǒng)清理,例如臨時文件或?qū)ν獠抠Y源狀態(tài)的任何類型更改,那么您將需要代碼在退出時處理所有這些事情,這通常優(yōu)雅地結(jié)合釋放記憶。
如果您的程序開始具有更長的生命周期,那么您將不希望釋放內(nèi)存的唯一方法是退出。例如,您可能希望將程序轉(zhuǎn)換為服務(wù)器(守護程序),該服務(wù)器在處理對單個工作單元的許多請求時保持運行,或者您的程序可能成為較大程序的一小部分。
但是,這是跳過釋放內(nèi)存的原因:高效關(guān)機。例如,假設(shè)您的應(yīng)用程序在內(nèi)存中包含一個大緩存。如果它退出時它會通過整個緩存結(jié)構(gòu)并一次釋放一個,這沒有任何用處,浪費資源。特別是,考慮操作系統(tǒng)將包含緩存的內(nèi)存頁面交換到磁盤的情況; 通過走結(jié)構(gòu)并釋放它,你將所有這些頁面一次性地帶回到內(nèi)存中,浪費了大量的時間和精力,沒有實際的好處,甚至可能導(dǎo)致系統(tǒng)上的其他程序被換掉!
作為一個相關(guān)的例子,有一些高性能服務(wù)器通過為每個請求創(chuàng)建一個進(jìn)程來工作,然后在完成時退出它; 通過這種方式,他們甚至不必跟蹤內(nèi)存分配,并且根本不進(jìn)行任何釋放或垃圾收集,因為在進(jìn)程結(jié)束時所有內(nèi)容都會消失回操作系統(tǒng)的可用內(nèi)存。(在使用自定義內(nèi)存分配器的進(jìn)程中可以完成同樣的事情,但需要非常仔細(xì)的編程;基本上在OS進(jìn)程中制定自己的“輕量級進(jìn)程”概念。)

TA貢獻(xiàn)1810條經(jīng)驗 獲得超4個贊
我很抱歉在最后一篇帖子發(fā)布到這個帖子后這么久了。
還有一點。并非所有程序都能讓它出色地退出。崩潰和ctrl-C等將導(dǎo)致程序以不受控制的方式退出。如果您的操作系統(tǒng)沒有釋放堆,清理堆棧,刪除靜態(tài)變量等,最終會導(dǎo)致系統(tǒng)崩潰或內(nèi)存泄漏。
有趣的是,Ubuntu中的崩潰/中斷,我懷疑所有其他現(xiàn)代操作系統(tǒng),確實存在“處理”資源的問題。當(dāng)程序結(jié)束/崩潰時,套接字,文件,設(shè)備等可以保持“打開”。在優(yōu)雅退出之前,作為清理工作的一部分,使用“手柄”或“描述符”關(guān)閉任何東西也是一種很好的做法。
我目前正在開發(fā)一個大量使用套接字的程序。當(dāng)我陷入困境時,我必須從中調(diào)出ctrl-c,因此,擱置我的插座。我添加了一個std :: vector來收集所有打開的套接字列表和一個捕獲sigint和sigterm的sigaction處理程序。處理程序遍歷列表并關(guān)閉套接字。我計劃在拋出前使用類似的清理程序,這將導(dǎo)致提前終止。
有人關(guān)心這個設(shè)計嗎?
- 3 回答
- 0 關(guān)注
- 497 瀏覽
添加回答
舉報