没错,在许多[start, end)
配对算法中,端点都超过了最后一个有效条目。但是您的实现不应该取消引用 end
,实际访问的最后一个条目应该是end-1
,保证在有效区域中。如果您的算法取消引用*end
,那么就是一个错误。事实上,有一些测试分配器有意将区域放置在有效页面的最后一个字节上,紧接着是一个未分配的区域。使用这样的分配器,取消引用的算法*end
将导致保护错误。
FLG_HEAP_PAGE_ALLOCS
打开页堆调试,它会验证动态堆内存操作,包括分配和释放,并在检测到堆错误时导致调试器中断。
此选项在为图像文件设置时启用整页堆调试,在系统注册表或内核模式中设置时启用标准页堆调试。
为图像文件设置此标志与在命令行中为图像文件键入 gflags /p enable /full 相同
至于指针溢出的问题:没有操作系统分配包含 VA 地址 0xFFFFFFFF 的页面,同样没有操作系统分配包含 0x00000000 的页面。为了发生这种溢出, 的大小*start
必须足够大,以便start+1
在有效范围结束时跳过所有保留的 VA。但在这种情况下,分配给的地址start
应该至少比最后一个有效的 VA 地址低一个这样的大小,这意味着start+1
将是有效的(start+N
只要start
分配为 ,它也总是有效的sizeof(*start)*N
)。