我做了以下程序:
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;
}
为什么 gflags 没有捕捉到这种越界访问?一般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/