Pageheap не заставляет мое приложение ломаться
Я ожидал, что Pageheap заставит мое приложение аварийно завершить работу при выполнении 2-го и 3-го операторов в приведенном ниже фрагменте кода. Но этого не происходит. Я включил полную страницу кучи для приложения.
Какие дополнительные вещи я должен сделать, чтобы pageheap сломал мое приложение во втором и третьем утверждениях?
char *test =new char[12];
memset(test,'c',15);
test[13] = 'c';
Но если я использую, следующее утверждение pagebreak сломает мое приложение
memset(test,'c',50);
1 ответ
Выделения округляются до N байтов, где N кратно 8 и зависит от того, какую версию Windows вы используете. Предположим, что для этого случая выделения округлены до ближайших 8 байтов.
Pageheap работает, вставляя "защитную страницу" в конце каждого размещения и защищая ее от доступа для чтения / записи, поэтому любая попытка ее использования приведет к нарушению доступа.
В этом случае ваше распределение test
запрашивает 12 байтов. Диспетчер кучи фактически выделяет 16 байтов. Доступ к test[15]
находится в пределах этого распределения, поэтому он не попадает на защитную страницу.
На одном дополнительном замечании я полагаю, что полная страница заполнит "дополнительную" память, возвращаемую выделением, некоторым специальным значением. Когда вы освобождаете выделение, он проверит "лишнюю" память и выдаст исключение, если значение было изменено.