我用 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
state,我怎么预约不了第一个0x3000
剩余的 0x7000
在分配边界?
最佳答案
您不能在同一分配边界内有两个单独的预留。
来自 VirtualAlloc 的文档:
lpAddress [in, optional] The starting address of the region to allocate. If the memory is being reserved, the specified address is rounded down to the nearest multiple of the allocation granularity.
(强调我的)
因此,您请求保留从 0x219000
开始的内存实际上是尝试保留从 0x210000
开始的内存,这是在现有分配范围内,因此是非法的。
(还应注意,不能保证任何特定的虚拟内存区域都可供您保留;Windows 可能已经将其保留用于其他目的。最佳做法是始终设置 lpAddress
参数为 NULL
,允许 Windows 为您选择一个地址。)
关于c++ - 为什么我不能在同一个分配中保留两个连续的内存区域而不用一次调用保留它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901127/