2015-07-05 67 views
3
  1. 父進程做的malloc()
  2. 父修改分配的內存塊中
  3. CoW的任意球和創造,同時保持舊副本到位
  4. 孩子沒有按」修改塊的一個副本t知道或關心父母的東西,並沒有呼籲免費()在其副本
  5. 內存泄漏!

我正確嗎?我錯了嗎?如果後者真的發生了什麼?malloc + fork是否會造成內存泄漏?

+1

只有在試圖修改內存塊的內容時纔會在子中調用CoW。子進程是父進程的精確副本(有些東西沒有被繼承,請參閱'man fork')。程序員應該在終止子程序之前調用'free()'。在程序結束時的清理也會這樣做。 –

回答

4

malloc()fork()都沒有造成泄漏 - 所以我想你錯了。

父級擁有自己的分配塊副本。它可以按照它的意願去做。孩子有自己的分配塊的副本。它也可以按照它的意願去做。如果孩子忽略了這個塊,那它就不是一個泄漏(還)。如果孩子輕率地踐踏一個指針,或者從一個函數返回,而該函數只保存指向已分配內存的函數而不先釋放它,則會導致泄漏。但它不是fork()malloc()

請記住,在fork()之後運行相同的代碼 - 進程之間的主要區別是PID和來自fork()的返回值。其他的東西(幾乎所有其他東西 - 細節參見fork()的POSIX規範)是相同的。因此,如果代碼泄漏,那是程序員引入的一個錯誤 - 它不是malloc()fork()的錯誤。

請注意,如果孩子使用exec*()函數族之一,則會釋放原始進程中分配的所有內存。新進程獲得分配的新內存。同樣,如果孩子退出,那麼內存將被釋放。 O/S失去記憶的軌跡不存在長期風險。

+0

簡而言之:如果孩子不關心由父母分配的塊,如果應該釋放()它。否則,該子塊的副本將在RAM中一直存在,直到子進程終止或執行被調用。正確? –

+0

是的;這是一個非常精確的事情總結,雖然它掩蓋了這樣的事實:釋放內存(通過free()返回)通常可以被另一個對malloc()調用重用,而不是返回到o/s 。 –