的確,如果作業系統實作正確,當程式結束之後,為它所分配的記憶體的確都會釋放掉,但問題是,對於一個行程記憶體的申請和釋放,是程式透過 sbrk,mmap 等系統呼叫進行的,也就是說, 行程應該對為它分配的記憶體負責 .
在堆記憶體上的數據,我們可以定義兩類,一類是可達的,一類是不可達的。
可達的就是,我可以透過程式現有的一些指標,獲取數據的地址,從而獲取數據,比如:
a
=
malloc
(
4
);
我們使用 malloc 申請了四字節的記憶體,然後函數返回了一個指標給我們,這個指標就指向這四字節記憶體的開始位置,於是我們把這個指標的值存到了變量
a
裏,於是,這四字節的記憶體就是「可達」的。
而如果是這樣呢:
malloc
(
4
)
我們僅僅是申請了 4 字節的記憶體,可是,我們卻沒有把這記憶體的起始地址存在任何一個地方,當 malloc 函數返回的時候,程式就沒有辦法知道這段記憶體的起始位置了,既然沒辦法知道,那麽這四字節的記憶體,就變成了「不可達」的,或者說 unreachable 的,但是它仍然是作業系統為我們分配的記憶體,