http://blog.csdn.net/slj_win/article/details/20461909
2014
malloca/alloca:
內(nèi)存分配函數(shù),與malloc,calloc,realloc類似。但是注意一個(gè)重要的區(qū)別,_alloca是在棧(stack)上申請(qǐng)空間,用完馬上就釋放。
alloca包含在頭文件malloc.h中,在某些系統(tǒng)中會(huì)宏定義成_alloca使用。
注意:
1)在調(diào)用 alloca的函數(shù)返回的時(shí)候, 它分配的內(nèi)存會(huì)自動(dòng)釋放。也就是說(shuō), 用 alloca 分配的內(nèi)存在棧上。所以釋放不需要用戶使用free.
2)alloca不具可移植性,而且在沒(méi)有傳統(tǒng)堆棧的機(jī)器上很難實(shí)現(xiàn)。當(dāng)它的返回值直接傳入另一個(gè)函數(shù)時(shí)會(huì)帶來(lái)問(wèn)題,因?yàn)樗峙湓跅I稀?br>
總結(jié):由于這些原因,alloca不宜使用在必須廣泛移植的程序中, 不管它可能多么有用。
realloc:
重新分配內(nèi)存并返回void類型,如果沒(méi)有足夠的內(nèi)存擴(kuò)展內(nèi)存塊,則原來(lái)的指向的內(nèi)存指針無(wú)變化,并返回NULL;如果重新分配大小設(shè)為0,而釋放原來(lái)的內(nèi)存塊, 并返回NULL.
calloc:
分配指定數(shù)目的元素,每個(gè)元素的大小由size指定, 并將其初始化為0,calloc調(diào)用malloc使用C++ _set_new_mode函數(shù)來(lái)設(shè)置新的處理方式,默認(rèn)情況下,malloc 失敗時(shí)不調(diào)用分配內(nèi)存的處理程序例程。
malloc:
從堆上分配指定大小的字節(jié)數(shù)并返回void類型,如分配失敗則返回NULL,malloc分配的字節(jié)數(shù)可能比指定的字節(jié)要多,這是由內(nèi)存對(duì)齊方式?jīng)Q定的,malloc實(shí)際上調(diào)用了HeapAlloc函數(shù), 因此malloc分配的內(nèi)存也不能跨進(jìn)程調(diào)用。
new:
分配內(nèi)存的對(duì)象或數(shù)組類型的對(duì)象和返回一個(gè)適當(dāng)類型,并調(diào)用對(duì)象的構(gòu)造函數(shù)及在delete時(shí)調(diào)用對(duì)象的析構(gòu)函數(shù)。其實(shí)現(xiàn)基于malloc調(diào)用。
下面是windows系統(tǒng)提供的API函數(shù):
1、VirtualAlloc/VirtualAllocEx
在虛擬地址空間中保留或提交內(nèi)存, 每次操作大小為Page頁(yè)大小(windows一般為4K)的整數(shù)倍,因此需要自己計(jì)算內(nèi)存分配算法(可以使用HeapAlloc或GlobalAlloc由系統(tǒng)自動(dòng)分配計(jì)算),在沒(méi)有使用MEM_RESET的情況下會(huì)初始化內(nèi)存塊(0), VirtualAllocEx還可以在其他進(jìn)程中的保留內(nèi)存操作,并使用其對(duì)應(yīng)的VirtualFree/VirtualFreeEx釋放內(nèi)存
2、HeapAlloc/HeapFree
在指定的Heap中分配內(nèi)存,heap應(yīng)該由CreateHeap或GetProcessHeap返回,分配的內(nèi)存不能移動(dòng),CreateHeap創(chuàng)建的堆只能在調(diào)用的進(jìn)程中使用,因此如需跨進(jìn)程調(diào)用不能使用此種分配方式,由HeapFree釋放。
3、GlobalAlloc/GlobalFree
從全局堆分配指定字節(jié)的內(nèi)存,分配的內(nèi)存可跨進(jìn)程訪問(wèn),并使用8字節(jié)對(duì)齊方式, 由GlobalFree釋放,在使用GlobalAlloc分配的內(nèi)存塊時(shí)需調(diào)用GlobalLock和GlobalUnlock函數(shù)。
PS:為了更好的理解內(nèi)存分配,我們可以了解一下內(nèi)存分區(qū)。
聯(lián)系客服