为什么Windows的gflags不会因这段代码而崩溃?

Why doesn't Windows' gflags fail to crash with this code?

本文关键字:代码 崩溃 段代码 Windows gflags 为什么      更新时间:2023-10-16

我编写了如下程序:

int main() {
    int* p = new int[10];
    delete[] p;
    p[0] = 0;
    return 0;
}

然后我在启用gflags的情况下执行这个程序:

C:tmpTest2Debug>"C:Program FilesDebugging Tools for Windowsgflags.exe" -p /enable Test2.exe /full
path: SOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options
    test2.exe: page heap enabled
C:tmpTest2Debug>test2
C:tmpTest2Debug>
如预期的那样,程序崩溃了。用调试器运行它,我可以看到它在这一行崩溃:
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;或者更大的代码。