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] находится в пределах этого распределения, поэтому он не попадает на защитную страницу.

На одном дополнительном замечании я полагаю, что полная страница заполнит "дополнительную" память, возвращаемую выделением, некоторым специальным значением. Когда вы освобождаете выделение, он проверит "лишнюю" память и выдаст исключение, если значение было изменено.

Другие вопросы по тегам