1. 程式人生 > >malloc()到底如何申請記憶體空間?

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

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

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

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

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

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

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