windows記憶體申請

2021-07-22 11:12:00 字數 1257 閱讀 8012

在進行windows的學習過程中,經常看到不同的記憶體分配方式,例如virtualalloc, heapalloc, malloc和new。它們之間存在一些差異。

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來釋放。

heapalloc是windows提供的api,在程序初始化的時候,系統會在程序的位址空間中建立1m大小的堆,稱為預設堆(default heap),該大小為預設值,可以通過/heap聯結器開關進行修改。使用者也可以通過heapcreate建立額外的堆,堆的使用可以更有效的進行記憶體管理,避免執行緒同步的開銷以及快速的釋放記憶體等。heapalloc用於從堆上分配乙個記憶體塊,如果分配成功則返回記憶體塊的位址。heapalloc內部會根據請求的大小以及堆的大小來決定具體的實現,例如在需要大的記憶體空間時,會自動呼叫virtualalloc函式分配空間。該函式通常用來分配一般大小的記憶體空間,一些windows api可能會要求使用該函式進行記憶體分配並傳遞給api引數。注意,在分配大的記憶體塊時(例如1m或者更多)最好避免使用堆函式,建議使用virtualalloc。

使用heapfree釋放由heapalloc的分配的記憶體。

c語言的記憶體分配函式,用於分配一般的記憶體空間,該函式分配的記憶體不會自動進行初始化。如果使用c語言程式設計,使用該函式。在visual c++ 中,malloc函式會呼叫heapalloc函式。

malloc分配的記憶體由free函式釋放。

c++語言的實現方式,在visual c++ 中,通過呼叫heapalloc實現記憶體分配,如果使用c++程式設計,建議使用new進行一般記憶體的分配。系統根據呼叫的方式決定是否對物件進行初始化。

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

使用new 分配的記憶體由delete / delete 進行釋放。

VC 記憶體申請

問題 如果要申請一塊記憶體?應該如何做?解答 在vc 一般的做法是 lpvoid pvdata 宣告乙個任何型別的指標 dword dwfilesize 申請記憶體的大小 分配全域性的可移動的記憶體 hglobal hglobal globalalloc gmem moveable,dwfilesi...

動態申請記憶體

如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。示例1中,test函式的語句getmemory str,100 並沒有使str獲得期望的記憶體,str依舊是null,為什麼?void getmemory char p,int num void test void 示例1 試圖用指標引數申...

記憶體申請 釋放

申請 我們使用mallco 向記憶體動態申請容量,那麼malloc 0 申請的到底是多大?明白一點,絕對不為0,malloc的時候程式會給分配乙個用於管理此程式快的結構體,其次由於更方便的管理記憶體,記憶體是需要對其的,那麼如果是對齊的,就並不一定為我們指定的大小,我們可以用malloc usabl...