久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

GlobalAlloc等函數(shù)/new,、malloc區(qū)別

 夜下月光 2014-03-15

GlobalAlloc是為了與Win16兼容才保留的,,在Win32下不要使用。 全局內(nèi)存對象使用GlobalAlloc函數(shù)分配,在Windows 3.X的時代,,分配的內(nèi)存可以有兩種,,全局的和局部的,例如GlobalAlloc和LocalAlloc,。但在Win32的時代這些函數(shù)已經(jīng)被廢棄了,,現(xiàn)在的內(nèi)存只有一種就是虛存。在Win32中所有的進(jìn)程所使用的內(nèi)存區(qū)域是相互隔離的,,每個進(jìn)程都擁有自己的地址空間,。而且系統(tǒng)使用了頁面交換功能,就是利用磁盤空間來模擬RAM,,在RAM中數(shù)據(jù)不使用時將會被交換到磁盤,,在需要時將會被重新裝入RAM。

兩者都是在堆上分配內(nèi)存區(qū),。 
malloc()是C運(yùn)行庫中的動態(tài)內(nèi)存分配函數(shù),,WINDOWS程序基本不使用了,因為它比WINDOWS內(nèi)存分配函數(shù)少了一些特性,,如,,整理內(nèi)存。 
GlobalAlloc()是16位WINDOWS程序使用的API,,返回一個內(nèi)存句柄,,在實際需要使用時,用GlobalLock()來實際得到內(nèi)存區(qū),。但,,32位WINDOWS系統(tǒng)中,應(yīng)使用新的內(nèi)存分配函數(shù)HeapAlloc()以得到更好的支持,,GlobalAlloc()還可以用,,主要是為了兼容。

HeapAlloc apply memory from kernel32.dll   
GlobalAlloc obsolete malloc   apply memory form C runtime   memory ,and C r untime applys         from    kernel32.dll   
new a wrapper of malloc but it is NOT a must for new to implement 
based on malloc.  

CoMemAlloc apply memory from kernel32.dll

all are heap memory.

recommend HeapAlloc for big block memory allocation 
recommend stack memory space.
recommend HeapAlloc for big block memory allocation 
recommend stack memory space.


malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),,new/delete是C++的運(yùn)算符,。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。 
對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求,。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),,對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運(yùn)算符,,不在編譯器控制權(quán)限之內(nèi),,不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。 
因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,,以及一個能完成清理與釋放內(nèi)存工作的運(yùn)算符delete,。注意new/delete不是庫函數(shù)。 
我們先看一看malloc/free和new/delete如何實現(xiàn)對象的動態(tài)內(nèi)存管理,,見示例7-8,。

class Obj{

public : 

Obj(){ cout << “Initialization” << endl; }

~Obj(){ cout << “Destroy” << endl; }

void Initialize(){ cout << “Initialization” << endl; }

void Destroy(){ cout << “Destroy” << endl; }

}; 
void UseMallocFree(){ 

Obj *a = (obj *)malloc(sizeof(obj)); // 申請動態(tài)內(nèi)存 

a->Initialize(); // 初始化 //…

 a->Destroy(); // 清除工作 

free(a); // 釋放內(nèi)存


void UseNewDelete(){

 Obj *a = new Obj; // 申請動態(tài)內(nèi)存并且初始化 //… 

delete a; // 清除并且釋放內(nèi)存


示例7-8 用malloc/free和new/delete如何實現(xiàn)對象的動態(tài)內(nèi)存管理

類Obj的函數(shù)Initialize模擬了構(gòu)造函數(shù)的功能,函數(shù)Destroy模擬了析構(gòu)函數(shù)的功能,。函數(shù)UseMallocFree中,,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來完成初始化與清除工作,。函數(shù)UseNewDelete則簡單得多,。 
所以我們不要企圖用malloc/free來完成動態(tài)對象的內(nèi)存管理,應(yīng)該用new/delete,。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構(gòu)造與析構(gòu)的過程,,對它們而言malloc/free和new/delete是等價的。 
既然new/delete的功能完全覆蓋了malloc/free,,為什么C++不把malloc/free淘汰出局呢,?這是因為C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存,。 
如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯,。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,,理論上講程序不會出錯,但是該程序的可讀性很差,。所以new/delete必須配對使用,,malloc/free也一樣。 
全局內(nèi)存對象使用GlobalAlloc函數(shù)分配,在Windows 3.X的時代,,分配的內(nèi)存可以有兩種,,全局的和局部的,例如GlobalAlloc和LocalAlloc,。但在Win32的時代這些函數(shù)已經(jīng)被廢棄了,,現(xiàn)在的內(nèi)存只有一種就是虛存。在Win32中所有的進(jìn)程所使用的內(nèi)存區(qū)域是相互隔離的,,每個進(jìn)程都擁有自己的地址空間,。而且系統(tǒng)使用了頁面交換功能,,就是利用磁盤空間來模擬RAM,在RAM中數(shù)據(jù)不使用時將會被交換到磁盤,,在需要時將會被重新裝入RAM,。


調(diào)用GlobalAlloc函數(shù)分配一塊內(nèi)存,該函數(shù)會返回分配的內(nèi)存句柄,。
調(diào)用GlobalLock函數(shù)鎖定內(nèi)存塊,,該函數(shù)接受一個內(nèi)存句柄作為參數(shù),然后返回一個指向被鎖定的內(nèi)存塊的指針,。您可以用該指針來讀寫內(nèi)存,。
調(diào)用GlobalUnlock函數(shù)來解鎖先前被鎖定的內(nèi)存,該函數(shù)使得指向內(nèi)存塊的指針無效,。
調(diào)用GlobalFree函數(shù)來釋放內(nèi)存塊,。您必須傳給該函數(shù)一個內(nèi)存句柄。

GlobalAlloc
說明
分配一個全局內(nèi)存塊
返回值
Long,,返回全局內(nèi)存句柄,。零表示失敗。會設(shè)置GetLastError
參數(shù)表
參數(shù) 類型及說明
wFlags Long,,對分配的內(nèi)存類型進(jìn)行定義的常數(shù)標(biāo)志,,如下所示:
             GMEM_FIXED 分配一個固定內(nèi)存塊
             GMEM_MOVEABLE 分配一個可移動內(nèi)存塊
             GMEM_DISCARDABLE 分配一個可丟棄內(nèi)存塊
             GMEM_NOCOMPACT 堆在這個函數(shù)調(diào)用期間不進(jìn)行累積
             GMEM_NODISCARD 函數(shù)調(diào)用期間不丟棄任何內(nèi)存塊
             GMEM_ZEROINIT 新分配的內(nèi)存塊全部初始化成零
dwBytes Long,要分配的字符數(shù)
注解 
如指定了 GMEM_FIXED,,那么返回值就是要使用的實際內(nèi)存地址即指針(GlobalLock 會返回同樣的值)——所以在使用固定內(nèi)存塊的時候不需要執(zhí)行一個 GlobalLock/GlobalUnlock 操作
由于 Win32 采用了高級的內(nèi)存管理方案,,所以使用可移動的內(nèi)存塊并沒有什么好處
用這個函數(shù)分配的內(nèi)存塊允許在8位邊界以內(nèi)
【附】關(guān)于GlobalAlloc的問題
--------------------------------------------------------------------------------
問:在使用 GlobalAlloc 分配一個全局內(nèi)存塊時,使用GMEM_FIXED分配一個固定內(nèi)存塊與使用GMEM_MOVEABLE分配一個可移動內(nèi)存塊到底有什么不同,?(請 具 體 點)
其效率上是否也存在差異,?
為什么在有些源碼中,再使用GMEM_MOVEABLE標(biāo)志分配內(nèi)存時,,將使用GlobalFree對其返回的內(nèi)存句柄進(jìn)行釋放操作的語句注釋掉,,或者干脆就不寫?難道是不需要這么做嗎,?
--------------------------------------------------------------------------------
答:GMEM_MOVEABLE是允許操作系統(tǒng)(或者應(yīng)用程序)實施對內(nèi)存堆的管理,,在必要時,操作系統(tǒng)可以移動內(nèi)存塊獲取更大的塊,,或者合并一些空閑的內(nèi)存塊,,也稱“垃圾回收”,它可以提高內(nèi)存的利用率,。一般情況下,,內(nèi)存堆空間是由用戶來管理的,windows操作系統(tǒng)不干預(yù)。如果存在下列情況,,即堆中有10個1K的空閑塊,,這時如果直接申請一個5K的內(nèi)存空間,會得到不成功的信息,。但如果其它已經(jīng)被占用的內(nèi)存塊是movable,,這時系統(tǒng)就可以移動這些內(nèi)存塊,合并出一個5k的內(nèi)存塊,,并成功分配給用戶使用,。它的空間效率是以運(yùn)行時的時間效率為代價的。

GlobalLock 
函數(shù)功能描述:鎖定一個全局的內(nèi)存對象,,返回指向該對象的第一個字節(jié)的指針
函數(shù)原型:
LPVOID GlobalLock( HGLOBAL hMem )
參數(shù):
hMem:全局內(nèi)存對象的句柄,。這個句柄是通過GlobalAlloc或GlobalReAlloc來得到的
返回值:
調(diào)用成功,返回指向該對象的第一個字節(jié)的指針
調(diào)用失敗,,返回NULL,,可以用GetLastError來獲得出錯信息
注意:
調(diào)用過GlobalLock鎖定一塊內(nèi)存區(qū)后,一定要調(diào)用GlobalUnlock來解鎖,。

GlobalUnlock
函數(shù)功能描述:解除被鎖定的全局內(nèi)存對象
函數(shù)原型:BOOL GlobalUnlock( HGLOBAL hMem );
參數(shù):hMem:全局內(nèi)存對象的句柄
返回值:
非零值,,指定的內(nèi)存對象仍處于被鎖定狀態(tài)
0,函數(shù)執(zhí)行出錯,,可以用GetLastError來獲得出錯信息,,如果返回NO_ERROR,則表示內(nèi)存對象已經(jīng)解鎖了
注意:    這個函數(shù)實際上是將內(nèi)存對象的鎖定計數(shù)器減一,,如果計數(shù)器不為0,,則表示執(zhí)行過多個GlobalLock函數(shù)來對這個內(nèi)存對象加鎖,需要對應(yīng)數(shù)目的GlobalUnlock函數(shù)來解鎖,。
    如果通過GetLastError函數(shù)返回錯誤碼為ERROR_NOT_LOCKED,,則表示未加鎖或已經(jīng)解鎖。

示例:
// Malloc memory
hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, nSize);
// Lock memory
pMem = (BYTE *) GlobalLock(hMem);
..................
// Unlock memory
GlobalUnlock(hMem);

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多