首先解释HEAP CORRUPTION DELECTED问题,这个编译器报错,主要是由于内存new/delect失当。如果编译器提示HEAP CORRUPTION DELECTED,以及CRT detected that the application wrote to memory after end of heap buffer,那么首先要检查以下几个方面:
1)new的空间够不够,中间的一些操作有没有使得数组越界。
2)delect释放的空间是不是你new出来的空间,有没有多释放或者乱释放。
3)是不是delect了已经delect的空间。
其次,我们来解释一下什么是HEAP CORRUPTION。当我们使用的空间超过了预先申请的空间,那么多出来的部分就会覆盖内存下界标识符以及之后的一段存储空间,这就是HEAP CORRUPTION。如果这段被HEAP CORRUPTION地空间中存储了比较重要的数据,黑客就可以利用HEAP CORRUPTION来修改这段数据。
解释清楚HEAP CORRUPTION问题以后,我们现在来研究深入一下堆分配(HEAP ALLOCTION)在内存中的实现原理。假如我们分配10byte的空间,那么我们就需要大约32byte的额外空间存储它的管理信息。在堆中,OS用双向链表结构管理内存,在Normal模式下,管理信息用_CrtMemBlockHeader结构保存,在这个结构定义了前指针pBlockHeaderPrev和后指针pBlockHeaderNext,用这两个指针可以遍历所申请的全部内存空间,在这结构中,成员变量IRequest用来记录当前堆是第几次被申请的。堆的释放操作是:根据堆的首地址将释放的堆从链表中脱链,完成堆释放操作。堆数据末尾是0xFDFDFDFD这个越界检查标志,一旦这个标志被覆盖,就会报出HEAP CORRUPTION这个错误。
简单总结一下,当new一个内存时,系统会用_CrtMemBlockHeader这个双向链表管理堆空间,这个结构保存了上、下一个堆的地址,本次堆分配的大小以及堆的越界标识符等等信息,Debug会检查这个结构以确定内存分配释放是否正确,一旦出现越界的情况,会报HEAP CORRUPTION提示信息,那么着重检查上文中的原因就有很大可能能排除错误。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。