Pageheap не заставляет мое приложение ломаться - PullRequest
1 голос
/ 08 мая 2011

Я ожидал, что Pageheap вызовет сбой моего приложения при выполнении 2-го и 3-го операторов в приведенном ниже фрагменте кода. Но этого не происходит. Я включил полную страницу кучи для приложения.

Какие дополнительные действия я должен сделать, чтобы pageheap сломал мое приложение во втором и третьем утверждениях?

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

Но если я воспользуюсь, следующий оператор разрыва страницы сломает мое приложение

memset(test,'c',50);

1 Ответ

2 голосов
/ 08 мая 2011

Распределения округляются в большую сторону N байт, где N кратно 8 и зависит от используемой версии Windows.Предположим, что для этого случая выделения округляются до ближайших 8 байтов.

Pageheap работает, вставляя «защитную страницу» в конце каждого выделения и защищая ее от доступа на чтение / запись, поэтому любая попыткаиспользование этого приведет к нарушению доступа.

В этом случае ваше выделение test запрашивает 12 байтов.Диспетчер кучи фактически выделяет вам 16 байтов.Доступ к test[15] находится в пределах этого выделения, поэтому он не попадает на защитную страницу.

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

...