有
4種用於記憶體分配的
api函式。虛擬
virtual
函式用於分配和管理大數量的記憶體,堆函式
heap
用於小數量記憶體,全域性函式
global
及區域性函式
local
用於小數量記憶體分配,這兩類函式是為了實現與
16位系統相容而提供的。
win32 api
仍然維護全域性以及區域性的堆函式,但是它們都是從區域性的
2gb中分配記憶體。這些堆對於程序而言都是區域性的,不能被其他程序訪問。
當乙個程式需要分配乙個至少幾
kb快取時,使用
virtualalloc
函式獲得記憶體塊。它以
4kb為單位獲取記憶體,分配的記憶體以
4kb來對齊。當程式需要為小物件,陣列或者結構分配記憶體時,呼叫
heapalloc
函式更合適。將
virtualalloc
函式用於對小資料結構的訪問會造成記憶體資源的浪費。
每個程序都有乙個預設堆,但是為了提高效率和便於管理,程式也可以分配額外的堆。每個堆都有自己的控制代碼,呼叫
getprocessheap
函式獲得預設堆的控制代碼。
程序中的執行緒可以訪問程序中的預設堆,
win32
記憶體管理對堆的訪問是序列的。當乙個執行緒執行乙個堆函式時,其他執行緒對記憶體的請求就會被掛起直到函式結束。這樣會給程式帶來很小的延遲。如果乙個執行緒需要訪問一些堆並且不想與其他執行緒分享這個堆,那麼為執行緒分配私有堆
private heap
動態鏈結庫在預設情況下不擁有自己的堆,它與呼叫它的程序共享堆,
dll可以分配自己的私有堆並使用它。
當程式使用完堆以後一定要釋放堆。否則會產生記憶體洩漏
memory leak
。乙個規則就是,誰分配誰釋放。
用calloc 函式分配記憶體
用calloc 函式分配記憶體 calloc函式原型 void calloc size t num elements,size t element size 在標頭檔案中宣告的calloc 函式與malloc 函式相比有兩個優點。第一,它把記憶體分配為給定大小的陣列,第二,它初始化了所分配的記憶體,...
C 通過呼叫函式分配記憶體
1 以返回值方式返回 把動態分配的儲存位置位址,賦值給指標型別返回值 不同於被呼叫函式的自動變數位址 2 以形參形式返回 二級指標型別做形參 1 include 2 include 3 4 void fun int p 7 8 int main 段錯誤 1 include 2 include 3 4...
C 通過呼叫函式分配記憶體
1 以返回值方式返回 把動態分配的儲存位置位址,賦值給指標型別返回值 不同於被呼叫函式的自動變數位址 2 以形參形式返回 二級指標型別做形參 1 include 2 include 3 4 void fun int p 7 8 int main 段錯誤 1 include 2 include 3 4...