2010-08-25 80 views
1

Linux是否會立即自動重新聲明應用程序使用的所有內存?Linux和內存泄漏

如果是這樣,那麼應用程序真的會在退出之前釋放所有內存?

在調用exit(0)之前真的有必要在多線程應用程序中調用每個類的析構函數嗎?

如果Linux總是立即重新聲明應用程序使用的所有內存,那麼內存泄漏只是應用程序創建的懸掛指針,而且它也只是它的生命週期。

回答

6

Linux會立即自動重新聲明應用程序使用的所有內存嗎?

不,但是在你意味着的意義上。所有屬於該進程的虛擬內存都被釋放。不共享的幀可用於其他進程。

如果是這樣的話,那麼應用程序真的會在退出前釋放所有內存嗎?

是的,有以下幾個原因:

  • 您可以決定伸向其他用途的代碼在未來,加入清理以後可能很難。
  • 您的內存使用量過高,實際上需要「浪費」虛擬內存空間。
  • 您需要找出一些錯誤:不謹慎釋放獲得的資源將會使調試變得非常困難。

當沒有釋放內存是您想要的時候可能會出現的情況,通常這些會與性能相關,並且只針對這些情況。

在調用exit(0)之前真的值得在多線程應用程序中調用每個類的析構函數嗎?

這與上一個問題非常相似。另請注意,不釋放來自第三方的資源,操作系統庫與釋放內存的效果完全相同。

如果Linux總是立即重新聲明應用程序使用的所有內存,那麼內存泄漏只是應用程序創建的懸掛指針,也只是它的生命週期。

是。這個理論唯一破壞的時候是所持有的資源是全球性的,並且在流程終止時不會消失。共享內存,設計不佳的第三方庫,臨時文件等都是這些例子。

+1

此外,還有專業性。 – Joe 2010-08-25 12:45:48

+0

@Hasturkun:謝謝我從來沒有引用過 – 2010-08-25 14:33:29

+0

@Joe:你是什麼意思? – 2010-08-25 15:59:25

2

它確實取決於這些構造函數的作用。如果他們所做的只是釋放私人記憶,那麼不需要。

如果他們做了其他事情,比如可能沒有寫入數據的光盤文件,那麼這可能很重要。

我非常喜歡_exit()庫調用的大風扇 - 它就像exit()但atexit處理程序不運行。

強大的應用程序應該能夠隨時容忍消失,因此有效的退出方式是_exit(),因爲它比受到更多的控制而不是崩潰。

當然還有其他泄漏資源的方式 - 這不僅僅是記憶。臨時文件是一個明顯的文件 - 在你調用_exit之後它將保持存在。

此外,如果您創建posix或sysv共享內存它保持現有的進程退出。這實際上類似於臨時文件(在Linux下,它在內核中的tmpfs上實現爲一個)