malloc與free的原理

2021-08-15 23:31:00 字數 822 閱讀 7062

malloc/free用於內部資料型別動態的申請記憶體及釋放記憶體。

1. malloc 與 free的原理

malloc 函式利用系統呼叫來完成對記憶體的申請分配,系統將可用的記憶體塊連線成為乙個長長的列表稱為空閒鍊錶,呼叫malloc時,將遍歷鍊錶,找到滿足申請空間的空閒鍊錶塊,然後將鍊錶塊分為兩個部分,一部分大小和使用者申請的相同,分配給使用者使用,另一部分返回給鍊錶。呼叫free時,將使用者釋放的記憶體塊連線到鍊錶中。這樣,空閒鍊錶中會存在大量的記憶體碎片,如果使用者呼叫malloc申請大的記憶體塊時,鍊錶中就可能不存在滿足要求的空閒記憶體塊,這時malloc函式請求延時,並對空閒鍊錶中記憶體塊執行整理,將相鄰的記憶體塊合併成大的記憶體塊,如果使用者的申請的記憶體大於空閒鍊錶可提供的最大連續記憶體,將呼叫系統呼叫指令mmap向系統申請新的虛擬記憶體滿足使用者需要,並將其加入鍊錶管理。

2. malloc 與free的實現

利用空閒鍊錶演算法作為堆空間分配演算法,在實現上將整個堆空間按照是否被占用分割為若干空閒(free)塊和占用(used)塊,它們之間利用雙向鍊錶連線起來。當使用者要申請一塊記憶體時,堆分配演算法將遍歷整個鍊錶,直到找到一塊滿足要求的空閒塊,如果這個空閒塊正好和所申請大小相同,就直接標記空閒塊為占用塊,然後將位址返回給使用者。如果空閒塊大小大於使用者申請大小,就將空閒塊分割為兩部分,其中一塊大小為申請大小,分配給使用者,並標記為占用,另外一塊仍為空閒塊。如果沒有找到足夠大的空閒塊,則利用系統呼叫(brk, mmap)向系統申請再申請一塊空間。

當使用者釋放一塊記憶體時,堆分配演算法會判別被釋放的記憶體塊錢後兩個塊是否為空閒塊,如果是,將它們合併為乙個大的空閒塊,標記為空閒塊,不是,直接標記為空閒塊。

3. malloc/free 與 new/delete 區別

malloc和free的實現原理

對於malloc來說,很多人都不陌生。然而,我們對它的了解並不是很深,我們常常會用,而不明白其中的原理,從而,很容易造成記憶體洩漏,記憶體碎片等問題。這常常讓我們頭痛不已,故而我們需要進一步的去了解它。首先,什麼事malloc?在很多人認為malloc是個關鍵字,但是malloc只是c的標準庫中提供...

malloc與free和new delete的區別

不同點 1 操作物件有所不同。malloc與free是c c 語言的標準庫函式,new delete 是c 的運算子。對於非內部資料類的物件而言,光用maloc free 無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件消亡之前要自動執行析構函式。由於malloc free 是庫函式...

malloc與free函式用法

在c裡,記憶體管理是通過專門的函式來實現。另外,為了相容各種程式語言,作業系統提供的介面通常是c 語言寫成的函式宣告 windows 本身也由c和組合語言寫成 1分配記憶體malloc函式 需要包含標頭檔案 include 函式宣告 函式原型 void malloc int size 說明 mall...