c語言記憶體分配函式之間的區別

2021-06-20 18:45:31 字數 1767 閱讀 3624

malloca/alloca:

記憶體分配函式,與malloc,calloc,realloc類似。但是注意乙個重要的區別,_alloca是在棧(stack)上申請空間,用完馬上就釋放。

alloca包含在標頭檔案malloc.h中,在某些系統中會巨集定義成_alloca使用。

注意:1)在呼叫 alloca的函式返回的時候, 它分配的記憶體會自動釋放。也就是說, 用 alloca 分配的內存在棧上。所以釋放不需要使用者使用free.

2)alloca不具可移植性,而且在沒有傳統堆疊的機器上很難實現。當它的返回值直接傳入另乙個函式時會帶來問題,因為他分配在棧上。

總結:由於這些原因,alloca不宜使用在必須廣泛移植的程式中, 不管它可能多麼有用。

realloc:

重新分配記憶體並返回void型別,如果沒有足夠的記憶體擴充套件記憶體塊,則原來的指向的記憶體指標無變化,並返回null;如果重新分配大小設為0,而釋放原來的記憶體塊, 並返回null.

calloc:

分配指定數目的元素,每個元素的大小由size指定, 並將其初始化為0,calloc呼叫malloc使用c++ _set_new_mode函式來設定新的處理方式,預設情況下,malloc 失敗時不呼叫分配記憶體的處理程式例程。

malloc:

從堆上分配指定大小的位元組數並返回void型別,如分配失敗則返回null,malloc分配的位元組數可能比指定的位元組要多,這是由記憶體對齊方式決定的,malloc實際上呼叫了heapalloc函式, 因此malloc分配的記憶體也不能跨程序呼叫。

new:

分配記憶體的物件或陣列型別的物件和返回乙個適當型別,並呼叫物件的建構函式及在delete時呼叫物件的析構函式。其實現基於malloc呼叫。

下面是windows系統提供的api函式:

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函式。

ps:為了更好的理解記憶體分配,我們可以了解一下記憶體分割槽。

1)棧區(stack)- 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2)堆區(heap) - 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os** .

3)全域性區(靜態區)(static)-,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。 -程式結束後有系統釋放。注意:全域性區又可分為未初始化全域性區:.bss段和初始化全域性區:data段。

4)常量區-常量字串就是放在這裡的。程式結束後由系統釋放

5)**區-存放函式體的二進位制**。

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

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

C語言的記憶體分配

文章一 c語言的記憶體分配模型 1 程式 區 存放函式體的二進位制 2 全域性區資料區 全域性資料區劃分為三個區域。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。常量資料存放在另乙個區域裡。這些資料在程式結...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...