malloc 到底如何申請記憶體空間?

2021-08-21 17:20:03 字數 794 閱讀 2865

malloc()到底從**得到了記憶體空間?

答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。

作業系統中有乙個記錄空閒記憶體位址的鍊錶。當作業系統收到程式的申請時,就會遍歷該鍊錶,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式。

malloc函式的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒鍊錶(free list)。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊(根據不同的演算法而定(將最先找到的不小於申請的大小記憶體塊分配給請求者,將最合適申請大小的空閒記憶體分配給請求者,或者是分配最大的空閒塊記憶體塊)。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。

呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行返回值的判斷。

在此也要說明就是因為new和malloc需要符合大眾的申請記憶體空間的要求,針對泛型提供的,分配記憶體設計到分配演算法和查詢,此外還要避免記憶體碎片,所以其效率比較低下,因此有時程式猿會自己重寫new和delete,或者建立乙個記憶體池來管理記憶體,提高程式執行的效率。

malloc動態申請記憶體

1 malloc概述 malloc num 動態申請num位元組的記憶體空間,函式申請成功返回記憶體的起始位址 void型 申請不成功返回null指標,malloc不初始化記憶體空間 calloc type,num 函式會初始化申請的記憶體空間為0 使用完申請的記憶體後需要用free p 釋放記憶體...

malloc申請堆記憶體

malloc申請空間時,記錄其空間大小 其空間上方,有乙個資料頭,頭部資訊就記錄了申請空間的大小 當呼叫free函式時,即需要讀取頭部資訊得到需要釋放的位元組數 malloc申請的空間,一 申請的記憶體 小的靠近資料區 大的靠近棧區,而中間的是 無人區 malloc工作在user space 使用者...

new 與malloc申請記憶體區別

首先我們需要了解堆與棧的概念。區分堆記憶體與棧記憶體的區別。以及堆與棧訪問速度的差異的原因。1.屬性 new delete是c 關鍵字,需要編譯器支援。malloc free是庫函式,需要標頭檔案支援。2.引數 使用new 操作副申請記憶體分配時無須制定記憶體塊的大小,編譯器會根據型別資訊自行計算。...