我預計Pageheap會強制我的應用程序崩潰,同時在下面的代碼塊中執行第2條和第3條語句。但是這沒有發生。我爲應用程序啓用了整頁堆。Pageheap不會讓我的應用程序中斷
我應該做些什麼來使pageheap在第二個和第三個語句中打破我的應用程序?
char *test =new char[12];
memset(test,'c',15);
test[13] = 'c';
,但如果我用,下面的語句分頁符會打破我的應用程序
memset(test,'c',50);
我預計Pageheap會強制我的應用程序崩潰,同時在下面的代碼塊中執行第2條和第3條語句。但是這沒有發生。我爲應用程序啓用了整頁堆。Pageheap不會讓我的應用程序中斷
我應該做些什麼來使pageheap在第二個和第三個語句中打破我的應用程序?
char *test =new char[12];
memset(test,'c',15);
test[13] = 'c';
,但如果我用,下面的語句分頁符會打破我的應用程序
memset(test,'c',50);
分配是四捨五入ñ字節,其中N是8的倍數,取決於哪個版本的Windows你正在使用。假設分配四捨五入到最接近的8個字節。
Pageheap通過在每個分配結束時插入一個「保護頁」並保護它免受讀/寫訪問的影響,所以任何嘗試使用它都會導致訪問衝突。
在這種情況下,您分配的test
正在請求12個字節。堆管理器實際上是給你一個16字節的分配。訪問test[15]
在這個分配範圍內,所以它沒有打到警衛頁面。
在另外一個筆記中,我相信一個完整的pageheap將會填充具有特殊值的分配返回的'額外'內存。當你釋放分配時,它將檢查'額外'內存並在值更改時引發異常。
你在pageheap中使用了哪些標誌?另外,如果可能的話,您應該使用Application Verifier。它取代pageheap。 – 2011-05-08 10:44:19
我用Pageheap選項gflags.exe/p/enable CheckStack.exe/full – Maanu 2011-05-08 10:50:56