在Windows中,堆栈实现如下:指定的页面遵循已提交的堆栈页面。它的保护标志是守卫的。因此,当thead引用guared页面上的地址时,内存故障会上升,这会使内存管理器将受保护的页面提交到堆栈并清理页面的防护标志,然后它会保留一个新的页面作为防护。
当我分配一个大小超过一页(4KB)的缓冲区时,没有发生预期的错误。为什么呢?
答案 0 :(得分:7)
优秀的问题(+1)。
有一个技巧,很少有人知道它(除了司机作家)。
当您在堆栈上分配大缓冲区时 - 编译器会自动添加所谓的堆栈探测。这是一个额外的代码(通常在CRT中实现),它以所需的顺序逐页探测分配的区域。
修改强>
该功能为_chkstk
。
答案 1 :(得分:0)
故障未到达您的程序 - 它由操作系统处理。当您的程序尝试读取恰好写入交换文件的内存时会发生类似的事情 - 发生陷阱并且操作系统取消交换页面并继续执行程序。