簡體   English   中英

為什么我不能在同一分配中保留兩個連續的內存區域,而不用一次調用就保留兩個連續的內存區域?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM