VirtualAlloc的使用

在應用程序中使用虛擬內存(VirtualAlloc VirtualFree)

本文轉載以下博客,百度百科,cpp文檔

https://blog.csdn.net/baidu_25539425/article/details/78764156

https://blog.csdn.net/u012372584/article/details/79621538

https://www.cnblogs.com/arsense/p/6505690.html

https://baike.baidu.com/item/VirtualAlloc/1606859?fr=aladdin

可以簡單認爲,用於一個申請空間的接口。

VirtualAlloc是一個Windows API函數,它包含在windows系統文件Kernel32.dll中,編程時直接使用就可以了,不需要再下載。

該函數的功能是在調用進程的虛地址空間,預定或者提交一部分頁

如果用於內存分配的話,並且分配類型未指定MEM_RESET,則系統將自動設置爲0;

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

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

VirtualAlloc作用

1、在虛擬地址空間中預定一塊內存區域;

2、調撥物理存儲器。

此虛擬內存非彼虛擬內存,此虛擬內存實際上指的是虛擬地址空間 
LPVOID VirtualAlloc{ 
LPVOID lpAddress, // 要分配的內存區域的地址 
DWORD dwSize, // 分配的大小 
DWORD flAllocationType, // 分配的類型 
DWORD flProtect // 該內存的初始保護屬性 
}; 
1.這個函數可以用來對虛擬地址空間進行分配(保留操作MEM_RESERVE) 
2.這個函數可以把已經保留的虛擬地址提交到物理存儲器(MEM_COMMIT) 
3.這個函數可以使RAM上的內容無效(MEM_RESET)

這個函數的注意點 
1.該函數會將傳入lpAddress圓整爲64KB(分配粒度)的倍數,然後通過返回值傳一個基地址給你,也就是說該函數返回的值要麼爲NULL,要麼爲64KB的倍數 
2.如果該函數調用失敗,會直接返回NULL 
3.當函數進行保留操作時,不管使用怎樣的保護屬性,都對提交的保護屬性沒影響,但是,若是想讓系統高效運行,最好讓保留操作和提交操作的保護屬性一致 
4.保留操作和提交操作可以同時進行,方法是設置flAllocationType=MEM_RESERVE|MEM_COMMIT 
5.使用MEM_RESET標誌可使RAM頁面內容無效,防止系統佔用已用內存時,把RAM寫到硬盤的頁文件,因爲這個操作會降低系統的運行效率,但是經過我的測試,這個標誌只在windows2000下有效,在windows xp 或者win7無效(所以這條可以不考慮)

BOOL VirtualFree( 
LPVOID lpAddress, // 區域地址 
SIZE_T dwSize, // 區域大小,字節 
DWORD dwFreeType // 類型); 
看名字都看得出來,這個函數時釋放或者解除虛擬地址到物理存儲器的映射 
使用這個函數時只能釋放區域的全部內存,但是收回物理存儲器時卻可不受此限制
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章