我做了以下程序:
int main() {
int* p = new int[10];
delete[] p;
p[0] = 0;
return 0;
}
然后我在启用gflags的情况下执行了该程序:
C:\tmp\Test2\Debug>"C:\Program Files\Debugging Tools for Windows\gflags.exe" -p /enable Test2.exe /full
path: SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options
test2.exe: page heap enabled
C:\tmp\Test2\Debug>test2
C:\tmp\Test2\Debug>
如预期的那样,程序崩溃。使用调试器运行它,我可以看到它在此行崩溃:
p[0] = 0;
这就是我的期望。
但是,此程序不会崩溃:
int main() {
int* p = new int[10];
p[10] = 0;
return 0;
}
为什么gflag无法捕获这种越界访问?通常,gflags检测到哪种堆错误,而未检测到哪些错误?
最佳答案
但是该程序不会崩溃:
int main() {
int* p = new int[10];
p[10] = 0;
return 0;
}
为什么gflags不能抓住这个?
因为
new
操作通常会分配过多的内存,以达到内存对齐的目的。如果要崩溃,只需使用p[1025] = 0;
或更大的名称即可。关于c++ - 为什么Windows的gflags不会因该代码而崩溃?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7138659/