在Windows中,堆栈实现如下:指定的页面紧随提交的堆栈页面。 这是保护国旗是守卫。 因此,当引用保存页面上的地址时,内存故障会增加,内存pipe理器将保护页面提交到堆栈并清理页面的保护标志,然后保留一个新的页面。
当我分配一个大小超过一页(4KB)的缓冲区时,然而,预期的错误没有发生。 为什么?
优秀的问题(+1)。
有一个技巧,很少有人知道(除了司机作家)。
在堆栈中分配大量缓冲区时,编译器会自动添加所谓的堆栈探测器 。 这是一个额外的代码(通常在CRT中实现),它按照需要的顺序逐页地探测分配的区域。
编辑:
该函数是_chkstk
。
故障没有到达您的程序 – 它由操作系统处理。 类似的事情发生在你的程序试图读取正好写入交换文件的内存时 – 发生了一个陷阱,操作系统解除了页面,程序继续。