c++ - 为什么我不能在同一个分配中保留两个连续的内存区域而不用一次调用保留它们?

标签 c++ winapi memory-management allocation virtual-memory

我用 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/

相关文章:

c++ - 在 C++ 中隐藏黑色窗口

c++ - 如何忽略 MSVC 中未初始化的变量错误

c++ - 如何在 Linux 上构建和运行 Unreal C++ 项目?

c++ - 互锁变量访问( bool 值)和 std::atomic_flag 之间的区别

c - MinGW 上函数 'getaddrinfo' 的隐式声明

c - 为什么c语言中没有检查数组使用的下标是否超过数组的大小?

ios - 如何找到对象正在释放的位置

c++ - 为什么未实例化未调用的模板类成员?

c++ - 从预处理器获取Windows版本(C++ Win32)

c - 段错误如何在内部(内核/硬件)工作?