2011-08-21 102 views
0

我做了以下程序:爲什麼Windows的gflags無法使用此代碼崩潰?

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檢測到哪種堆錯誤,以及未檢測到什麼錯誤?

+0

此列表位於:http://technet.microsoft.com/en-us/library/cc779664%28WS.10%29.aspx'堆尾檢查'功能將無法正常工作,因爲您忘記釋放記憶。 –

+0

@Hans Passant:謝謝!爲什麼你發佈這個評論而不是答案? –

+0

呃,它只是鏈接湯。隨意發佈它自己。 –

回答

3

但這個方案不崩潰:

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

爲什麼GFLAGS不趕呢?

由於內存對齊的目的,new操作通常會分配比您想要的更多的內存。如果你想要崩潰,只需使用p[1025] = 0;或更大的東西。