VC 常用分配記憶體函式簡介及比較

2021-09-30 05:15:49 字數 3171 閱讀 9126

vc++常用分配記憶體函式簡介及比較

1. 首先我們來看heapalloc:

msdn上的解釋為:heapalloc是從堆上分配一塊記憶體,且分配的記憶體是不可移動的(即如果沒有連續的空間能滿足分配的大小,程式不能將其他零散的 空間利用起來,從而導致分配失敗),該分配方法是從一指定位址開始分配,而不像gloabalalloc是從全域性堆上分配,這個有可能是全域性,也有可能是 區域性。函式原型為:

lpvoid

heapalloc(handle hheap, dword dwflags, size_t dwbytes);

hheap是程序堆記憶體開始位置。

dwflags是分配堆記憶體的標誌。包括heap_zero_memory,即使分配的空間清零。

dwbytes是分配堆記憶體的大小。

其對應的釋放空間函式為heapfree。

2. 再看globalalloc:該函式用於從全域性堆中分配出記憶體供程式使用,函式原型為:

hglobal globalalloc(uint uflags, size_t dwbytes);

uflags引數含義

ghnd   gmem_moveable和gmem_zeroinit的組合

gmem_fixed   分配固定記憶體,返回值是乙個指標

gmem_moveable   分配活動記憶體,在win32中,記憶體塊不能在物理記憶體中移動,但能在預設的堆中移動。返回值是記憶體物件的控制代碼,用函式globallock可將控制代碼轉化為指標

gmem_zeroinit   將記憶體內容初始化為零

gptr   gmem_fixed和gmem_zeroinit的組合

一般情況下我們在程式設計的時候,給應用程式分配的記憶體都是可以移動的或者是可以丟棄的,這樣能使有限的記憶體資源充分利用,所以,在某乙個時候我們分配的那塊 記憶體的位址是不確定的,因為他是可以移動的,所以得先鎖定那塊記憶體塊,這兒應用程式需要呼叫api函式globallock函式來鎖定控制代碼。如下: lpmem=globallock(hmem); 這樣應用程式才能訪問這塊記憶體。所以我們在使用globalallock時,通常搭配使用globallock,當然在不使用記憶體時,一定記得使用 globalunlock,否則被鎖定的記憶體塊一直不能被其他變數使用。

globalalloc對應的釋放空間的函式為globalfree。

3. localalloc:該函式用於從區域性堆中分配記憶體供程式使用,函式原型為:

hlocal localalloc(uint uflags, size_t ubytes);

引數同globalalloc。

在16位windows中是有區別的,因為在16位windows用乙個全域性堆和區域性堆來管理記憶體,每乙個應用程式或dll裝入記憶體時,**段被裝入全域性 堆,而系統又為每個例項從全域性堆中分配了乙個64kb的資料段作為該例項的區域性堆,用來存放應用程式的堆疊和所有全域性或靜態變數。而 localalloc/globalalloc就是分別用於在區域性堆或全域性堆中分配記憶體。

由於每個程序的區域性堆很小,所以在區域性堆中分配記憶體會受到空間的限制。但這個堆是每個程序私有的,相對而言分配資料較安全,資料訪問出錯不至於影響到整個系統。

而在全域性堆中分配的記憶體是為各個程序共享的,每個程序只要擁有這個記憶體塊的控制代碼都可以訪問這塊記憶體,但是每個全域性記憶體空間需要額外的記憶體開銷,造成分配浪費。而且一旦發生嚴重錯誤,可能會影響到整個系統的穩定。

不過在win32中,每個程序都只擁有乙個省缺的私有堆,它只能被當前程序訪問。應用程式也不可能直接訪問系統記憶體。所以在win32中全域性堆和區域性堆都 指向程序的省缺堆。用localalloc/globalalloc分配記憶體沒有任何區別。甚至localalloc分配的記憶體可以被 globalfree釋放掉。所以在win32下程式設計,無需注意local和global的區別,一般的記憶體分配都等效於 heapalloc(getprocessheap(),...)。

localalloc對應的釋放函式為lockfree。

4. virtualalloc:該函式的功能是在呼叫程序的虛位址空間,預定或者提交一部分頁,如果用於記憶體分配的話,並且分配型別未指定mem_reset,則系統將自動設定為0;其函式原型:

lpvoid virtualalloc(

lpvoid lpaddress, // region to reserve or commit

size_t dwsize, // size of region

dword flallocationtype, // type of allocation

dword flprotect // type of access protection

);virtualalloc可以通過並行多次呼叫提交乙個區域的部分或全部來保留乙個大的記憶體區域。多重呼叫提交同一塊區域不會引起失敗。這使得乙個應用程 序保留記憶體後可以隨意提交將被寫的頁。當這種方式不在有效的時候,它會釋放應用程式通過檢測被保留頁的狀態看它是否在提交呼叫之前已經被提交。

virtualalloc對應的釋放函式為virtualfree。

5.malloc:malloc與free是c++/c語言的標準庫函式,可用於申請動態記憶體和釋放記憶體。對於非內部資料型別的物件而言,光用 malloc/free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc/free是 庫函式而不是運算子,不在編譯器控制許可權之內,不能夠把執行建構函式和析構函式的任務強加於malloc/free。

6.new:new/delete是c++的運算子。可用於申請動態記憶體和釋放記憶體。c++語言需要乙個能完成動態記憶體分配和初始化工作的運算子new, 以乙個能完成清理與釋放記憶體工作的運算子delete。注意new/delete不是庫函式。c++程式經常要呼叫c函式,而c程式只能用malloc /free管理動態記憶體。new 是個操作符,和什麼"+","-","="...有一樣的地位.

malloc是個分配記憶體的函式,供你呼叫的.

new是保留字,不需要標頭檔案支援.

malloc需要標頭檔案庫函式支援.new 建立的是乙個物件,

malloc分配的是一塊記憶體.

new建立的物件你可以把它當成乙個普通的物件,用成員函式訪問,不要直接訪問它的位址空間

malloc分配的是一塊記憶體區域,就用指標訪問好了,而且還可以在裡面移動指標.

記憶體洩漏對於malloc或者new都可以檢查出來的,區別在於new可以指明是那個檔案的那一行,而malloc沒有這些資訊。new可以認為是 malloc加建構函式的執行。new出來的指標是直接帶型別資訊的。而malloc返回的都是void指標。

常用記憶體分配函式的說明

下面哪種c c 分配記憶體的方法會將分配的空間初始化為0 a malloc b calloc c realloc d new 1 malloc 函式 void malloc unsigned int size 在記憶體的動態分配區域中分配乙個長度為size的連續空間,如果分配成功,則返回所分配記憶體...

記憶體結構 堆結構及記憶體分配函式

linux對記憶體結構的描述 1 在linux中,目錄 proc 下存放著相應程序執行時的所有訊號,其它maps中包含對該程序的記憶體分配信資訊,在命令列下執行maps即可檢視 必須是當前執行中的程序,程序結束時,對應目錄自動銷毀 補 ps aue 檢視有效程序 a所有使用者 u當前使用者 d當前程...

c語言動態分配記憶體及記憶體分配部分函式

include 在c中動態分配記憶體的基本步驟有 1,用malloc類的函式分配記憶體 2,用這些記憶體支援應用程式 3,用free函式釋放記憶體 二 動態記憶體分配函式 malloc 從堆上分配記憶體 realloc 在之前分配的記憶體塊的基礎上,將記憶體重新分配為更大或者更小的部分 calloc...