記憶體配置函數總結
收藏
記憶體分區:
1)、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值等。其操作方式類似於資料結構中的棧。
2)、堆區(heap) — 一般由程式員分配釋放, 若程式員不釋放,程式結束時可能由OS回收 。
3)、全域區(靜態區)(static)—,全域變數和靜態變數的儲存是放在一塊的,初始化的全域變數和靜態變數在一塊地區, 未初始化的全域變數和未初始化的靜態變數在相鄰的另一塊地區。 - 程式結束後有系統釋放
4)、常量區—常量字串就是放在這裡的。 程式結束後由系統釋放
5)、代碼區—存放函數體的二進位代碼。
1. VirtualAlloc/VirtualAllocEx
在虛擬位址空間中保留或提交記憶體, 每次操作大小為Page頁大小(windows一般為4K)的整數倍,
因此需要自己計算記憶體配置演算法(可以使用HeapAlloc或GlobalAlloc由系統自動分配計算),
在沒有使用MEM_RESET的情況下會初始化記憶體塊(0),
VirtualAllocEx還可以在其他進程中的保留記憶體操作,並使用其對應的VirtualFree/VirtualFreeEx釋放記憶體
2. HeapAlloc/HeapFree
在指定的Heap中分配記憶體,heap應該由CreateHeap或GetProcessHeap返回, 分配的記憶體不能移動,CreateHeap建立的堆只能在調用的進程中使用,因此如需跨進程調用不能使用此種分配方式,由HeapFree釋放.
3. GlobalAlloc/GlobalFree
從全域堆分配指定位元組的記憶體,分配的記憶體可跨進程訪問,並使用8位元組對齊, 由GlobalFree釋放, 在使用GlobalAlloc分配的記憶體塊時需調用GlobalLock和GlobalUnlock函數。
GlobalAlloc函數分配記憶體的速度要比其分的記憶體管理函數慢, 而且沒有提供更多的功能, 因此,建議儘可能用其分的記憶體管理函數分配記憶體,GlobalAlloc函數一般用於動態資料交換(DDE)技術和剪下板操作函數中。
4. malloc/free
從堆上分配指定大小的位元組數並返回void類弄,如分配失敗則返回NULL,malloc分配的位元組數可能比指定的位元組要多,這是由記憶體對齊決定的, malloc實際上調用了HeapAlloc函數, 因此malloc分配的記憶體也不能跨進程調用。
5. calloc
/free
分配指定數目的元素, 每個元素的大小由size指定, 並將其初始化為0, calloc調用malloc使用C++ _set_new_mode函數來設定新的處理方式,
預設情況下,malloc
失敗
時不調用分配記憶體的處理常式常式。
6.
realloc/free
重新分配記憶體並返回void類型, 如果沒有足夠的記憶體擴充記憶體塊,則原來的指向的記憶體指標無變化, 並返回NULL;
如果重新分配大小設為0, 而釋放原來的記憶體塊, 並返回NULL。
7. _malloca/_alloca/_freea
從棧中分配指定大小的記憶體塊
8. new/delete
分配記憶體的對象或數群組類型的對象和返回一個適當類型,並調用對象的建構函式及在delete時調用對象的解構函式。其實現基於malloc調用。
前3個記憶體管理函數是windows系統提供的API函數, 而後面5個是c/c++庫中提供的函數