[英]When I reserve memory with VirtualAlloc() and MEM_RESERVE, shouldn't I be able to grow my allocation on a 64K boundary?
[英]Why can't I reserve two contiguous memory regions in the same allocation without reserving both with a single call?
我有兩個用VirtualAlloc
分配的內存區域: 0x1E0000 (Size: 0x39000, Reserve)
和0x219000 (Size: 0x3000, Commit)
。 它們都在同一分配邊界內(在這種情況下,其舍入為0x40000 (64K*4)
),第二個區域從第一個區域開始。
現在,忘記提交部分一分鍾。 如果我MEM_RESERVE
第一0x39000
,然后MEM_RESERVE
下一0x3000
,我得到ERROR_INVALID_ADDRESS
。 不過,如果我MEM_RESERVE
一氣呵成既, 0x39000+0x3000=0x3C000
,那么它的作品,我可以使用MEM_COMMIT
成功提交第二區域。
這是為什么? 為什么我不能保留每個零件而不是一個大的保留區域? 保留第一個區域后,分配(0x219000-0x21FFFF)
的剩余區域將具有MEM_FREE
狀態,那么為什么我不能在分配邊界中保留剩余0x7000
的第一個0x3000
?
同一分配范圍內不能有兩個單獨的預留。
從VirtualAlloc的文檔中:
lpAddress [in,可選]要分配的區域的起始地址。 如果正在保留內存,則將指定的地址四舍五入到分配粒度的最接近倍數。
(強調我的)
因此,您從0x219000
開始保留內存的請求實際上嘗試從0x210000
開始保留內存,該內存在現有分配內部,因此是非法的。
(還應注意,不能保證您可以保留虛擬內存的任何特定區域; Windows可能已經出於其他目的保留了它。最佳實踐是始終將lpAddress
參數設置為NULL
,從而允許Windows為您選擇一個地址。)
通過進行兩個預留,您要求系統分別管理它們,但是正如您所注意到的,它們位於同一分配范圍內,因此很可能作為一個單元進行管理。 如果您請求該單元的一部分,則另一部分將不再使用。
但是,如果將它們一起保留,則要求將它們一起管理,因此不需要拆分。
從方法的文檔中:
要分配的區域的起始地址。 如果正在保留內存,則將指定的地址四舍五入到分配粒度的最接近倍數。
因此,您的第二個實際上保留與第一個相同的位置開始的位置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.