malloc,free動態申請釋放記憶體機制

2021-06-14 00:23:42 字數 872 閱讀 2143

1.當堆中的空間不足時,malloc會呼叫sbrk系統呼叫來想作業系統申請獲得更多的堆空間。雖然sbrk可以擴充貨縮小程序的儲存空間,但是大多數malloc和free的實現都不減小程序的儲存空間。釋放的空間可供以後再分配,但通常將他們保持在malloc池中而不返回給核心。

2.堆中的空閒塊組成乙個空閒鍊錶,每個空閒塊在開始處都有乙個結構用於存放管理記錄,在管理記錄中存放著該塊的大小(size)和指向下乙個塊的指標,管理記錄後是空閒空間。這些空閒塊按位址增序組織成煉表,且最後乙個塊指向第乙個塊。

3.malloc申請過程:當呼叫malloc申請空間時,遍歷空閒塊鍊錶直到找到乙個能滿足申請空間大小的空閒塊(first fit)。如果空閒塊的大小剛好等於申請空間的大小時,則將此空閒塊從空閒塊鍊錶中斷開並將此空閒空間返回給使用者;如果空閒塊的大小比申請的空間大的話,則要將空間塊劃分,前面滿足申請大小的空間返回給使用者,後面餘下的空閒空間繼續放在空閒鍊錶中。如果沒有找到滿足申請空間的空閒空間,則向作業系統申請另一足夠大的空閒空間並鏈結到空閒空間鍊錶中。

4.free操作同樣要搜尋空閒空間鍊錶,以便找到合適的地方插入被釋放的塊。如果釋放的記憶體空間在兩邊都有空閒塊相連則將其合併成乙個大的空閒塊。

5.解決記憶體對齊問題

typedef long align;

union header s;

align x;

};typedef union header header;

在解釋記憶體對齊的作用前,先來看下記憶體對齊的規則:

記憶體對齊的主要作用是:

6.如果在超過乙個已分配區的尾端進行寫操作,則會中寫後乙個塊的管理記錄,同樣在已分配區起始位置之前進行寫操作會重寫本塊的管理記錄。

動態申請記憶體

如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。示例1中,test函式的語句getmemory str,100 並沒有使str獲得期望的記憶體,str依舊是null,為什麼?void getmemory char p,int num void test void 示例1 試圖用指標引數申...

c c 動態申請陣列

new和delete運算子用於動態分配和撤銷記憶體的運算子 new用法 1.開闢單變數位址空間 1 new int 開闢乙個存放陣列的儲存空間,返回乙個指向該儲存空間的位址.int a new int 即為將乙個int型別的位址賦值給整型指標a.2 int a new int 5 作用同上,但是同時...

c 動態申請空間

使用new申請空間 特點 1 沒有名字,只能通過指標間接訪問它們。2 從堆中申請空間 分類 變數 語法 指標變數 new 型別名 delete 指標變數 舉例 int p p new int delete p 初始化 p 90 p new int 99 一維陣列 語法 指標變數 new 型別名 下標...