當前位置: 華文星空 > 知識

既然每個程式占用的記憶體都是作業系統管理的,為什麽記憶體泄漏還是個問題?

2020-06-08知識

的確,如果作業系統實作正確,當程式結束之後,為它所分配的記憶體的確都會釋放掉,但問題是,對於一個行程記憶體的申請和釋放,是程式透過 sbrk,mmap 等系統呼叫進行的,也就是說, 行程應該對為它分配的記憶體負責 .

在堆記憶體上的數據,我們可以定義兩類,一類是可達的,一類是不可達的。

可達的就是,我可以透過程式現有的一些指標,獲取數據的地址,從而獲取數據,比如:

a = malloc ( 4 );

我們使用 malloc 申請了四字節的記憶體,然後函數返回了一個指標給我們,這個指標就指向這四字節記憶體的開始位置,於是我們把這個指標的值存到了變量 a 裏,於是,這四字節的記憶體就是「可達」的。

而如果是這樣呢:

malloc ( 4 )

我們僅僅是申請了 4 字節的記憶體,可是,我們卻沒有把這記憶體的起始地址存在任何一個地方,當 malloc 函數返回的時候,程式就沒有辦法知道這段記憶體的起始位置了,既然沒辦法知道,那麽這四字節的記憶體,就變成了「不可達」的,或者說 unreachable 的,但是它仍然是作業系統為我們分配的記憶體,