2011-05-08 49 views
1

我預計Pageheap會強制我的應用程序崩潰,同時在下面的代碼塊中執行第2條和第3條語句。但是這沒有發生。我爲應用程序啓用了整頁堆。Pageheap不會讓我的應用程序中斷

我應該做些什麼來使pageheap在第二個和第三個語句中打破我的應用程序?

char *test =new char[12]; 
memset(test,'c',15); 
test[13] = 'c'; 

,但如果我用,下面的語句分頁符會打破我的應用程序

memset(test,'c',50); 
+0

你在pageheap中使用了哪些標誌?另外,如果可能的話,您應該使用Application Verifier。它取代pageheap。 – 2011-05-08 10:44:19

+0

我用Pageheap選項gflags.exe/p/enable CheckStack.exe/full – Maanu 2011-05-08 10:50:56

回答

2

分配是四捨五入ñ字節,其中N是8的倍數,取決於哪個版本的Windows你正在使用。假設分配四捨五入到最接近的8個字節。

Pageheap通過在每個分配結束時插入一個「保護頁」並保護它免受讀/寫訪問的影響,所以任何嘗試使用它都會導致訪問衝突。

在這種情況下,您分配的test正在請求12個字節。堆管理器實際上是給你一個16字節的分配。訪問test[15]在這個分配範圍內,所以它沒有打到警衛頁面。

在另外一個筆記中,我相信一個完整的pageheap將會填充具有特殊值的分配返回的'額外'內存。當你釋放分配時,它將檢查'額外'內存並在值更改時引發異常。

+0

謝謝。當我在另一個名爲ICECon的應用程序中添加代碼時,PageHeap不會在memset中使應用程序中斷(test,'c',50);相反,它會在memset語句後執行一些其他方法後中斷。可能是什麼原因? – Maanu 2011-05-08 11:38:51

+0

@Maanu:你可以在調試器中轉儲'test'緩衝區。然後你會看到守衛頁面開始的地方(不可讀的內存)。 – glagolig 2013-09-07 23:41:29

相關問題