malloc, VirtualAlloc,HeapAlloc,New


在進行Windows的學習過程中,經常看到不同的內存分配方式,例如VirtualAlloc, HeapAlloc, malloc和new。它們之間存在一些差異。

 

(1) VirtualAlloc

PVOID VirtualAlloc(PVOID pvAddress, SIZE_T dwSize, DWORD fdwAllocationType, DWORD fdwProtect)

VirtualAlloc是Windows提供的API,通常用來分配大塊的內存。例如如果想在進程A和進程B之間通過共享內存的方式實現通信,可以使用該函數(這也是較常用的情況)。不要用該函數實現通常情況的內存分配。該函數的一個重要特性是可以預定指定地址和大小的虛擬內存空間。例如,希望在進程的地址空間中第50MB的地方分配內存,那么將參數 50*1024*`1024 = 52428800 傳遞給pvAddress,將需要的內存大小傳遞給dwSize。如果系統有足夠大的閑置區域能滿足請求,則系統會將該塊區域預訂下來並返回預訂內存的基地址,否則返回NULL。

使用VirtualAlloc分配的內存需要使用VirtualFree來釋放。

(2) HeapAlloc

HeapAlloc是Windows提供的API,在進程初始化的時候,系統會在進程的地址空間中創建1M大小的堆,稱為默認堆(Default Heap),該大小為默認值,可以通過/HEAP連接器開關進行修改。用戶也可以通過HeapCreate創建額外的堆,堆的使用可以更有效的進行內存管理,避免線程同步的開銷以及快速的釋放內存等。HeapAlloc用於從堆上分配一個內存塊,如果分配成功則返回內存塊的地址。HeapAlloc內部會根據請求的大小以及堆的大小來決定具體的實現,例如在需要大的內存空間時,會自動調用VirtualAlloc函數分配空間。該函數通常用來分配一般大小的內存空間,一些Windows API可能會要求使用該函數進行內存分配並傳遞給API參數。注意,在分配大的內存塊時(例如1M或者更多)最好避免使用堆函數,建議使用VirtualAlloc。

使用HeapFree釋放由HeapAlloc的分配的內存。

(3) malloc

C語言的內存分配函數,用於分配一般的內存空間,該函數分配的內存不會自動進行初始化。如果使用C語言編程,使用該函數。在Visual C++ 中,malloc函數會調用HeapAlloc函數。

malloc分配的內存由free函數釋放。

(4) new

C++語言的實現方式,在Visual C++ 中,通過調用HeapAlloc實現內存分配,如果使用C++編程,建議使用new進行一般內存的分配。系統根據調用的方式決定是否對對象進行初始化。

注意: new 在C++中實際上是操作符而不是函數。

使用new 分配的內存由delete / delete[] 進行釋放。

 


http://www.cppblog.com/woaidongmao/archive/2011/08/12/153160.aspx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM