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

标签 c++ windows debugging

我做了以下程序:

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/

相关文章:

python - 属性错误: module 'socket' has no attribute 'MSG_DONTWAIT'

c# - 使用不同的配置调试同一项目的 2 个以上实例

C++合并排序不会合并?

未捕获 C++ 异常(Qt 项目)

php - Linux Box 使用 PHP 将文件写入 Windows Server Web Share

c# - 强制窗口在打开时获得焦点

c++ - do while 循环中的 if 语句以 yes 或 no 结尾

c++ - boost 表现力!接线员不工作

c++ - C++ 中的调试宏

android-maven-插件 : Disable debug build for apk