C語言malloc和free實現原理

2021-07-25 03:14:14 字數 906 閱讀 8901

以下是一段簡單的c**,malloc和free到底做了什麼?

int main()  

malloc和free的debug和release版本實現各不相同,而且相差很大。

debug版本

malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下:

_crtmemblockheader是乙個雙向鍊錶結構,其定義如下:

typedef struct _crtmemblockheader  

_crtmemblockheader;  

使用者請求記憶體前後分別有4位元組的校驗位,分配記憶體後都會被初始化為0xfd。如果這8個位元組被改寫,free時就會觸發斷言失敗。

而請求的32位元組會被初始化為0xcc(和棧的初始化一樣)。

系統通過記錄這些資訊就能顯示的給出錯誤。比如越界訪問請求的內存在debug下會斷言失敗,release下面則不會,從而這會給程式埋下巨大的隱患。很多在release下偶發的錯誤就是這樣產生的。

_crtmemblockheader總共32位元組,加上使用者請求的32位元組及最後4位元組校驗位是68位元組。最終呼叫系統的api請求記憶體。比如windows下面是heapalloc。

如果記憶體分配失敗,malloc不像new那樣可以呼叫new_handler來處理,它直接返回null。

free則是對_crtmemblockheader的資訊做清理操作,檢查校驗位等等。最終呼叫系統api釋放記憶體。比如windows下面是heapfree。

release版本

實際分配的記憶體等於請求的記憶體大小。malloc和free只是在系統api之上做了些判斷操作。

總結c語言是跨平台的,最終的記憶體處理都是交給系統api完成。系統會記錄每一塊分配記憶體的位址,大小,釋放情況等等。所以free時只需要傳乙個位址的引數就可以了。而且同乙個位址不能釋放兩次。

C語言malloc和free實現原理

以下是一段簡單的c malloc和free到底做了什麼?int main malloc和free的debug和release版本實現各不相同,而且相差很大。malloc需要分配的記憶體會比實際的size多36byte。最終分配的記憶體塊如下 crtmemblockheader是乙個雙向鍊錶結構,其定...

C語言中的malloc和free

最近在研究php自定義函式的實現,其中php自定義函式在傳遞引數時,是放到人為的乙個棧中,這個跟寫c程式時,引數入棧的這個棧還不一樣,其中延伸到了 malloc 以及free 有人說在free p 後,要將p設定為null,在查詢了一翻資料後,大體上弄明白了是怎麼回事 malloc是向os要一塊記憶...

C語言中的malloc和free造成記憶體洩露?

首先,說一下我對記憶體洩露的理解,記憶體洩露是指 程式中一塊不再使用的記憶體沒有被釋放,造成記憶體保持占用狀態,使作業系統不能將記憶體分配給其它的程式 程序 在c語言,用的最多的管理記憶體的函式莫過於malloc和free了,下面我用vc6.0做了乙個小測試,原始碼如下 然後,使用vc6.0來除錯這...