free 函式是如何知曉記憶體塊大小的?

2021-10-05 01:20:06 字數 970 閱讀 1829

想要理解這個問題,必須先要了解一下malloc函式的實現。首先在程式執行時,系統會為它分配4g的虛擬記憶體,其中就包括堆(heap),堆是可在執行時(為變數)動態進行記憶體分配的一塊區域,堆頂端稱作program break。malloc分配的記憶體允許隨意釋放,它們被維護於一張空閒記憶體列表中,在後續記憶體分配呼叫時迴圈使用。malloc()的實現很簡單。它首先會掃瞄之前由 free()所釋放的空閒記憶體塊列表,以求找到尺寸大於或等於要求的一塊空閒記憶體。(取決於具體實現,採用的掃瞄策略會有所不同。例如,first-fit 或 best-fito。)如果這一記憶體塊的尺寸正好與要求相當,就把它直接返回給呼叫者。如果是一塊較大的記憶體,那麼將對其進行分割,在將一塊大小相當的記憶體返回給呼叫者的同時,把較小的那塊空閒記憶體塊保留在空閒列表中。如果在空閒記憶體列表中根本找不到足夠大的空閒記憶體塊,那麼 malloc()會呼叫 sbrk()以分配更多的記憶體。為減少對 sbrk()的呼叫次數,malloc()並未只是嚴格按所需位元組數來分配記憶體,而是以更大幅度(以虛擬記憶體頁大小的數倍)來增加 program break,並將超出部分置於空閒記憶體列表。當 malloc()分配記憶體塊時,會額外分配幾個位元組來存放記錄這塊記憶體大小的整數值。該整數字於記憶體塊的起始處,而實際返回給呼叫者的記憶體位址恰好位於這一長度記錄位元組之後。所以 free()將記憶體塊置於空閒列表之上時,通過訪問記憶體起始處的儲存的長度便可以知道記憶體的大小。

當將記憶體塊置於空閒記憶體列表(雙向鍊錶)時,free()會使用記憶體塊本身的空間來存放鍊錶指標,將自身新增到列表中。

c語言允許程式建立指向堆中任意位置的指標,並修改其指向的資料,包括由 free()和 malloc()函式維護的記憶體塊長度、指向前一空閒塊和後一空閒塊的指標。所以指標錯誤使用往往造成不可預料的結果。

free函式與記憶體管理

new 分配記憶體 呼叫建構函式 delete 釋放記憶體 呼叫析構函式 malloc 分配記憶體 free 釋放記憶體 free函式在msdn中的原型 void free void memblock functionrequired headercompatibility free,ansi,wi...

動態記憶體 free函式釋放記憶體時可能出現的問題

一 什麼是動態記憶體的申請和釋放?當程式執行到需要乙個動態分配的變數時,必須向系統申請取得堆中的一塊所需大小的儲存空間,用於儲存該變數。當不再使用該變數時,也就是它的生命結束時,要顯式釋放它所占用的儲存空間,這樣系統就能對該堆空間進行再次分配,做到重複使用有限的資源。二 我們先來看看幾個基本的關於申...

關於malloc函式後free記憶體空間的疑問

1 關於malloc函式後free記憶體空間的疑問 問題 malloc是開出記憶體空間。現在我寫了這麼一句 char name name char malloc len sizeof char name指標是個char指標,指向乙個char資料,即只保留了乙個char資料的長度資訊.free的時候它...