內存分配函數總結

內存分區:

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++庫中提供的函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章