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