我预计,在执行下面代码段中的第2和第3个语句时,Pageheap会强制我的应用程序崩溃。但这不会发生。我为应用程序启用了整页堆。
我应该采取哪些额外的措施来制作第一和第三个陈述中的分页来破坏我的申请?
char *test =new char[12];
memset(test,'c',15);
test[13] = 'c';
但如果我使用,以下语句分页符将破坏我的应用程序
memset(test,'c',50);
答案 0 :(得分:2)
分配是 N 字节的四舍五入,其中N是8的倍数,取决于您使用的Windows版本。在这种情况下,假设分配被四舍五入到最接近的8个字节。
Pageheap通过在每次分配结束时插入“保护页面”并保护其免受读/写访问,因此任何使用它的尝试都将导致访问冲突。
在这种情况下,test
的分配请求12个字节。堆管理器实际上给你一个16字节的分配。访问test[15]
在此分配范围内,因此不会访问保护页面。
另外一点,我相信一个完整的pageheap将填充具有一些特殊值的分配返回的“额外”内存。当您释放分配时,它将检查“额外”内存并在值更改时引发异常。