在堆栈上分配一个页面大小的缓冲区会损坏内存?

Windows中,堆栈实现如下:指定的页面紧随提交的堆栈页面。 这是保护国旗是守卫。 因此,当引用保存页面上的地址时,内存故障会增加,内存pipe理器将保护页面提交到堆栈并清理页面的保护标志,然后保留一个新的页面。

当我分配一个大小超过一页(4KB)的缓冲区时,然而,预期的错误没有发生。 为什么?

优秀的问题(+1)。

有一个技巧,很少有人知道(除了司机作家)。

在堆栈中分配大量缓冲区时,编译器会自动添加所谓的堆栈探测器 。 这是一个额外的代码(通常在CRT中实现),它按照需要的顺序逐页地探测分配的区域。

编辑:

该函数是_chkstk

故障没有到达您的程序 – 它由操作系统处理。 类似的事情发生在你的程序试图读取正好写入交换文件的内存时 – 发生了一个陷阱,操作系统解除了页面,程序继续。