Выделение буфера большего размера страницы в стеке приведет к повреждению памяти? - PullRequest
5 голосов
/ 08 ноября 2010

В Windows стек реализован следующим образом: за указанной страницей следуют зафиксированные страницы стека. Это защитный флаг как охраняемый. Поэтому, когда thead ссылается на адрес на защищаемой странице, возникает ошибка памяти, из-за которой диспетчер памяти фиксирует защищенную страницу в стеке и очищает флаг защиты страницы, а затем резервирует новую страницу как защищенную.

когда я выделяю буфер размером более одной страницы (4 КБ), ожидаемая ошибка не возникает. Почему?

Ответы [ 2 ]

7 голосов
/ 08 ноября 2010

Отличный вопрос (+1).

Есть хитрость, о которой мало кто знает (кроме писателей драйверов).

Когда вы выделяете большой стек в стеке - компилятор автоматическидобавляет так называемые стековые зонды .Это дополнительный код (обычно реализуемый в CRT), который исследует выделенную область постранично в нужном порядке.

РЕДАКТИРОВАТЬ:

Функция_chkstk.

0 голосов
/ 08 ноября 2010

Ошибка не доходит до вашей программы - она ​​обрабатывается операционной системой.Аналогичная ситуация происходит, когда ваша программа пытается прочитать память, которая записана в файл подкачки - возникает ловушка, и операционная система выгружает страницу, а ваша программа продолжает работать.

...