malloc函式

malloc函式

malloc的全稱是memory allocation,中文叫動態記憶體分配,用於申請一塊連續的指定大小的記憶體塊區域以void*類型返回分配的記憶體區域地址,當無法知道記憶體具體位置的時候,想要綁定真正的記憶體空間,就需要用到動態的分配記憶體,且分配的大小就是程式要求的大小。

基本介紹

  • 中文名動態記憶體分配
  • 外文名:memory allocation
  • 簡稱:malloc
  • 原型:extern void *malloc
  • 頭檔案:stdlib.h
  • 特點:由系統根據程式的需要即時分配
函式定義,工作機制,與new的區別,

函式定義

其函式原型為void *malloc(unsigned int size);其作用是在記憶體的動態存儲區中分配一個長度為size的連續空間。此函式的返回值是分配區域的起始地址,或者說,此函式是一個指針型函式,返回的指針指向該分配域的開頭位置。
如果分配成功則返回指向被分配記憶體的指針(此存儲區中的初始值不確定),否則返回空指針NULL。當記憶體不再使用時,應使用free()函式將記憶體塊釋放。函式返回的指針一定要適當對齊,使其可以用於任何數據對象
關於該函式的原型,在以前malloc返回的是char指針,新的ANSIC標準規定,該函式返回為void型指針,因此必要時要進行類型轉換。它能向系統申請分配一個長度為num_bytes(或size)個位元組的記憶體塊。
一般它需和free函式配對使用。free函式能釋放某個動態分配的地址,表明不再使用這塊動態分配的記憶體了,實現把之前動態申請的記憶體返還給系統。

工作機制

malloc函式的實質體現在,它有一個將可用的記憶體塊連線為一個長長的列表的所謂空閒鍊表。調用malloc函式時,它沿連線表尋找一個大到足以滿足用戶請求所需要的記憶體塊。然後,將該記憶體塊一分為二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的位元組)。接下來,將分配給用戶的那塊記憶體傳給用戶,並將剩下的那塊(如果有的話)返回到連線表上。調用free函式時,它將用戶釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時用戶申請一個大的記憶體片段,那么空閒鏈上可能沒有可以滿足用戶要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。如果無法獲得符合要求的記憶體塊,malloc函式會返回NULL指針,因此在調用malloc動態申請記憶體塊時,一定要進行返回值的判斷。
Linux Libc6採用的機制是在free的時候試圖整合相鄰的碎片,使其合併成為一個較大的free空間。

與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這個函式,另外,編譯器還會根據參數的類型,插入相應的構造函式)。
在使用上,malloc 和 new 至少有兩個不同: new 返回指定類型的指針,並且可以自動計算所需要大小。而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際類型的指針。另外有一點不能直接看出的區別是,malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。

相關詞條

熱門詞條

聯絡我們