1.malloc不是直接向作業系統申請,而是先由glibc記憶體管理器收到請求,其配置設定一段記憶體并把記憶體位址傳回給使用者。
2.對于傳回的記憶體位址p,p-4這個位址記錄了malloc空間的大小,這就是當你free時可以直接釋放記憶體而不用指定大小的原因。
3.這個malloc回來的空間大小是8位元組對齊的,也就是每次都是8的倍數。
4.對于p-4這裡記錄malloc空間大小不是空穴來風,而是因為他本身就是屬于一個叫做malloc_chunk的資料結構的一部分,如下圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LctmSYl1M5cUYx40MZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TN3gzMxYjM1ETNxUDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
struct malloc_chunk{
INTERNAL_SIZE_T prev_szie;
INTERNAL_SIZE_T size;
标志位;
使用者資料;
}
5.當運作
第一行定義了申請一個虛拟空間,第二行發生了頁中斷進一步申請了實體空間。
6.運作
得到0x19,去除3個的标志位的影響,得到0x18,真實申請的空間大小也就是24,由20個位元組實作8位元組對齊就可以計算出24。
7.标志位解釋
p = 1 表示上一塊正被使用 pre_size此時通常為0
p = 0 表示上一塊空閑 pre_size通常為上一塊的大小
M = 1 表示該記憶體塊通過mmap配置設定,隻有配置設定大塊記憶體時才采用mmap,對應釋放要采用munmap_chunk(),否則使用chunk_free()
M = 0 表示不是用mmap配置設定的。
8.malloc每次配置設定至少16位元組,是以每次隻配置設定1、2位元組實際上會造成不必要的浪費。
by: p4inkiller