我做了以下程序:

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/

10-11 23:07
查看更多