-
malloc函數
鎖定
- 中文名
- 動態內存分配
- 外文名
- memory allocation
- 簡 稱
- malloc
- 原 型
- extern void *malloc
- 頭文件
- stdlib.h
- 特 點
- 由系統根據程序的需要即時分配
malloc函數函數定義
其函數原型為void *malloc(unsigned int size);其作用是在內存的動態存儲區中分配一個長度為size的連續空間。此函數的返回值是分配區域的起始地址,或者説,此函數是一個指針型函數,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配內存的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當內存不再使用時,應使用free()函數將內存塊釋放。函數返回的指針一定要適當對齊,使其可以用於任何數據對象。
關於該函數的原型,在以前malloc返回的是char型指針,新的ANSIC標準規定,該函數返回為void型指針,因此必要時要進行類型轉換。它能向系統申請分配一個長度為num_bytes(或size)個字節的內存塊。
malloc函數工作機制
malloc函數的實質體現在,它有一個將可用的內存塊連接為一個長長的列表的所謂空閒鏈表的功能。調用malloc函數時,它沿連接表尋找一個大到足以滿足用户請求所需要的內存塊。然後,將該內存塊一分為二(一塊的大小與用户請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用户的那塊內存傳給用户,並將剩下的那塊(如果有的話)返回到連接表上。調用free函數時,它將用户釋放的內存塊連接到空閒鏈上。到最後,空閒鏈會被切成很多的小內存片段,如果這時用户申請一個大的內存片段,那麼空閒鏈上可能沒有可以滿足用户要求的片段了。於是,malloc函數請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各內存片段,對它們進行整理,將相鄰的小空閒塊合併成較大的內存塊。如果無法獲得符合要求的內存塊,malloc函數會返回NULL指針,因此在調用malloc動態申請內存塊時,一定要進行返回值的判斷。
Linux Libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合併成為一個較大的free空間。
malloc函數與new的區別
從本質上來説,malloc(Linux上具體實現可以參考man malloc,glibc通過brk()&mmap()實現)是libc裏面實現的一個函數,如果在source code中沒有直接或者間接include過stdlib.h,那麼gcc就會報出error:‘malloc’ was not declared in this scope。如果生成了目標文件(假定動態鏈接malloc),如果運行平台上沒有libc(Linux平台,手動指定LD_LIBRARY_PATH到一個空目錄即可),或者libc中沒有malloc函數,那麼會在運行時(Run-time)出錯。new則不然,是c++的關鍵字,它本身不是函數。new不依賴於頭文件,c++編譯器就可以把new編譯成目標代碼(g++4.6.3會向目標中插入_Znwm這個函數,另外,編譯器還會根據參數的類型,插入相應的構造函數)。