2016-12-01 28 views
0

我有兩個內存區域,我用VirtualAlloc0x1E0000 (Size: 0x39000, Reserve)0x219000 (Size: 0x3000, Commit)分配。這些都在相同的分配邊界內(在這種情況下四捨五入爲0x40000 (64K*4)),第二個區域從第一個結束處開始。爲什麼我不能在同一分配中保留兩個連續的內存區域,而不用同時調用兩個內存區域?

現在忘記提交部分一分鐘。如果我MEM_RESERVE第一個0x39000然後MEM_RESERVE0x3000,我得到ERROR_INVALID_ADDRESS。但是,如果我同時使用,0x39000+0x3000=0x3C000,那麼它工作正常,我可以使用MEM_COMMIT成功提交第二個區域。

這是爲什麼?爲什麼我不能自己保留每個部分而不是一個大的保留區域?在保留第一個區域之後,分配(0x219000-0x21FFFF)中的剩餘區域將具有MEM_FREE狀態,那麼我怎麼不能在分配邊界中保留其餘0x7000的第一個0x3000

+0

發表你的評論的代碼。我很難跟隨你想要做的事情。 –

回答

4

在同一分配邊界內不能有兩個單獨的保留。

從的VirtualAlloc的文檔:

lpAddress [在,可選] 的區域的起始地址來分配。 如果內存被保留,則指定地址向下舍入到分配粒度的最接近倍數。

(重點煤礦)

所以你的要求保留存儲器中,起始0x219000實際嘗試保留內存開始0x210000,這是現有的分配,因此非法裏面。 (也應該注意的是,不能保證虛擬內存的任何特定區域都可供您保留; Windows可能已經爲其他目的保留了它,最佳做法是始終將參數設置爲lpAddressNULL,允許Windows爲你選擇一個地址。)

1

通過提出兩個保留要求系統單獨管理它們,但是您注意到它們處於相同的分配邊界內,因此可能會作爲一個單元進行管理。如果您要求該單位的一部分,另一部分則不用。

但是,如果您將它們保留在一起,請求將它們一起管理,以免分裂。

documentation的方法:

分配的區域的起始地址。如果內存被保留,則指定的地址向下舍入到分配粒度的最接近的倍數。

因此,你的第二個實際上保留在第一個位置開始。

相關問題