国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項超值服

開通VIP
HeapAlloc、GlobalAlloc、LocalAlloc、VirtualAlloc、malloc、new的異同
http://hi.baidu.com/gamedot/blog/item/6fad84a78dbdb19fd0435846.html
 
1. HeapAlloc:
MSDN上的解釋為:HeapALloc是從堆上分配一塊內(nèi)存,且分配的內(nèi)存是不可移動的(即如果沒有連續(xù)的空間能滿足分配的大小,程序不能將其他零散的 空間利用起來,從而導(dǎo)致分配失?。摲峙浞椒ㄊ菑囊恢付ǖ刂烽_始分配,而不像GloabalAlloc是從全局堆上分配,這個有可能是全局,也有可能是 局部。函數(shù)原型為:
LPVOID
HeapAlloc(
    HANDLE hHeap,
    DWORD dwFlags,
   SIZE_T dwBytes
    );
hHeap是進(jìn)程堆內(nèi)存開始位置。
dwFlags是分配堆內(nèi)存的標(biāo)志。包括HEAP_ZERO_MEMORY,即使分配的空間清零。
dwBytes是分配堆內(nèi)存的大小。
其對應(yīng)的釋放空間函數(shù)為HeapFree。

2. GlobalAlloc
該函數(shù)用于從全局堆中分配出內(nèi)存供程序使用,函數(shù)原型為:
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
uFlags參數(shù)含義
GHND   GMEM_MOVEABLE和GMEM_ZEROINIT的組合
GMEM_FIXED   分配固定內(nèi)存,返回值是一個指針
GMEM_MOVEABLE   分配活動內(nèi)存,在Win32中,內(nèi)存塊不能在物理內(nèi)存中移動,但能在默認(rèn)的堆中移動。返回值是內(nèi)存對象的句柄,用函數(shù)GlobalLock可將句柄轉(zhuǎn)化為指針
GMEM_ZEROINIT   將內(nèi)存內(nèi)容初始化為零
GPTR   GMEM_FIXED和GMEM_ZEROINIT的組合
一般情況下我們在編程的時候,給應(yīng)用程序分配的內(nèi)存都是可以移動的或者是可以丟棄的,這樣能使有限的內(nèi)存資源充分利用,所以,在某一個時候我們分配的那塊 內(nèi)存的地址是不確定的,因為他是可以移動的,所以得先鎖定那塊內(nèi)存塊,這兒應(yīng)用程序需要調(diào)用API函數(shù)GlobalLock函數(shù)來鎖定句柄。如下: lpMem=GlobalLock(hMem); 這樣應(yīng)用程序才能存取這塊內(nèi)存。所以我們在使用GlobalAllock時,通常搭配使用GlobalLock,當(dāng)然在不使用內(nèi)存時,一定記得使用 GlobalUnlock,否則被鎖定的內(nèi)存塊一直不能被其他變量使用。
GlobalAlloc對應(yīng)的釋放空間的函數(shù)為GlobalFree。

3. LocalAlloc
該函數(shù)用于從局部堆中分配內(nèi)存供程序使用,函數(shù)原型為:
HLOCAL LocalAlloc(
UINT uFlags,
SIZE_T uBytes
);
參數(shù)同GlobalAlloc。
在16位Windows中是有區(qū)別的,因為在16位windows用一個全局堆和局部堆來管理內(nèi)存,每一個應(yīng)用程序或dll裝入內(nèi)存時,代碼段被裝入全局 堆,而系統(tǒng)又為每個實例從全局堆中分配了一個64kb的數(shù)據(jù)段作為該實例的局部堆,用來存放應(yīng)用程序的堆棧和所有全局或靜態(tài)變量。而 LocalAlloc/GlobalAlloc就是分別用于在局部堆或全局堆中分配內(nèi)存。
由于每個進(jìn)程的局部堆很小,所以在局部堆中分配內(nèi)存會受到空間的限制。但這個堆是每個進(jìn)程私有的,相對而言分配數(shù)據(jù)較安全,數(shù)據(jù)訪問出錯不至于影響到整個系統(tǒng)。
而在全局堆中分配的內(nèi)存是為各個進(jìn)程共享的,每個進(jìn)程只要擁有這個內(nèi)存塊的句柄都可以訪問這塊內(nèi)存,但是每個全局內(nèi)存空間需要額外的內(nèi)存開銷,造成分配浪費(fèi)。而且一旦發(fā)生嚴(yán)重錯誤,可能會影響到整個系統(tǒng)的穩(wěn)定。
不過在Win32中,每個進(jìn)程都只擁有一個省缺的私有堆,它只能被當(dāng)前進(jìn)程訪問。應(yīng)用程序也不可能直接訪問系統(tǒng)內(nèi)存。所以在Win32中全局堆和局部堆都 指向進(jìn)程的省缺堆。用LocalAlloc/GlobalAlloc分配內(nèi)存沒有任何區(qū)別。甚至LocalAlloc分配的內(nèi)存可以被 GlobalFree釋放掉。所以在Win32下編程,無需注意Local和Global的區(qū)別,一般的內(nèi)存分配都等效于 HeapAlloc(GetProcessHeap(),...)。
LocalAlloc對應(yīng)的釋放函數(shù)為LockFree。

4. VirtualAlloc
該函數(shù)的功能是在調(diào)用進(jìn)程的虛地址空間,預(yù)定或者提交一部分頁,如果用于內(nèi)存分配的話,并且分配類型未指定MEM_RESET,則系統(tǒng)將自動設(shè)置為0;其函數(shù)原型:
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize, // size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
VirtualAlloc可以通過并行多次調(diào)用提交一個區(qū)域的部分或全部來保留一個大的內(nèi)存區(qū)域。多重調(diào)用提交同一塊區(qū)域不會引起失敗。這使得一個應(yīng)用程 序保留內(nèi)存后可以隨意提交將被寫的頁。當(dāng)這種方式不在有效的時候,它會釋放應(yīng)用程序通過檢測被保留頁的狀態(tài)看它是否在提交調(diào)用之前已經(jīng)被提交。
VirtualAlloc對應(yīng)的釋放函數(shù)為VirtualFree。

5.Malloc
malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用 malloc/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。
6.New
new/delete是C++的運(yùn)算符??捎糜谏暾垊討B(tài)內(nèi)存和釋放內(nèi)存。C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new, 以一個能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫函數(shù)。C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc /free管理動態(tài)內(nèi)存。new 是個操作符,和什么"+","-","="...有一樣的地位.
        malloc是個分配內(nèi)存的函數(shù),供你調(diào)用的.
        new是保留字,不需要頭文件支持.
        malloc需要頭文件庫函數(shù)支持.new 建立的是一個對象,
        malloc分配的是一塊內(nèi)存.
        new建立的對象你可以把它當(dāng)成一個普通的對象,用成員函數(shù)訪問,不要直接訪問它的地址空間
        malloc分配的是一塊內(nèi)存區(qū)域,就用指針訪問好了,而且還可以在里面移動指針.
內(nèi)存泄漏對于malloc或者new都可以檢查出來的,區(qū)別在于new可以指明是那個文件的那一行,而malloc沒有這些信息。new可以認(rèn)為是malloc加構(gòu)造函數(shù)的執(zhí)行。new出來的指針是直接帶類型信息的。而malloc返回的都是void指針。
 
(#)
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
HeapAlloc和GlobalAlloc以及VirtualAlloc三者之間的關(guān)系 - Stay Hungry, Stay Foolish - 博客園
內(nèi)存的一些magic number和debug crt
Windows下動態(tài)內(nèi)存分配方式
c語言內(nèi)存分配函數(shù)之間的區(qū)別
GlobalAlloc等函數(shù)/new、malloc區(qū)別
VC中關(guān)于GlobalAlloc等的用法 - 產(chǎn)品和技術(shù) - 賽迪網(wǎng)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服