每个线程都有自己的栈(一块地址空间区域),默认是1MB并调拨两个页面的存储器,这个值可以通过编译器配置修改,也可以在创建线程的时候通过参数指定(0为默认)
系统永远不会给区域底部的那个页面调拨存储器(保护进程使用的其他数据)
如果线程在栈溢出后继续使用栈,系统会抛出访问违规异常。如果访问违规异常是线程试图访问栈时引发的,此时系统会弹框提示并退出整个进程
应该使用SetThreadStackGuarante避免此情况,抛出EXCEPTOU_STACK_OVERFLOW,使程序能够处理栈溢出并恢复运行
栈下溢,代码会试图访问线程之外的内存,应该尽力避免
Void func()
{
BYTE aBytes[100];
aBytes[10000]=0; //栈下溢
}
C/C++运行库的栈检查函数
确保已经给线程栈调拨了物理存储器,编译器会在必要时生成代码来调用栈检查函数
/Gs开关 控制页面大小的阈值(绝大多数情况下不必设置)