2010-11-08 43 views
4

在Windows中,堆棧的實現方式如下:指定的頁面緊隨提交的堆棧頁面。這是保護標誌是守衛。因此,當adad引用受保護頁面上的地址時,內存故障會增加,這會使內存管理器將保護頁面提交到堆棧並清除頁面的保護標誌,然後保留一個新的頁面作爲守護進程。在堆棧上分配更多頁面大小的緩衝區會損壞內存?

當我分配一個大小超過一頁(4KB)的緩衝區時,但是,沒有發生預期的錯誤。爲什麼?

回答

6

優秀的問題(+1)。

有一個竅門,很少有人知道它(除了司機作家)。

當您在堆棧上分配大緩衝區時 - 編譯器會自動添加所謂的堆棧探測器。這是一個額外的代碼(通常在CRT中實現),它以所需的順序逐頁探測分配的區域。

編輯:

功能是_chkstk

+0

我在哪裏可以看到該代碼? – sharptooth 2010-11-08 12:41:24

+0

記錄在這裏:http://msdn.microsoft.com/en-us/library/ms648426%28VS.85%29.aspx – valdo 2010-11-08 12:44:17

+0

另請參見chkstk.asm在CRT源代碼(用於MSVC) – valdo 2010-11-08 12:45:27

0

故障沒有到達您的程序 - 它由操作系統處理。類似的事情發生在程序試圖讀取恰巧寫入交換文件的內存時 - 發生陷阱並且操作系統斷開頁面並且程序繼續。

+0

幾乎正確。當您按順序訪問堆棧並跨越下一個頁面邊界時,會發生這種情況。但是在上述場景中,當您在堆棧中分配大型變量時,需要額外的技巧。 – valdo 2010-11-08 12:41:41