最近在移植一份神代码,遇到各种问题。好多个都是内存越界的原因。今天遇到了free(): corrupted unsorted chunks。以前也看过一点关于free是如何释放内存的东西,好久没写博客了,顺道写点吧,老玩也不是个事。
先说一下free(): corrupted unsorted chunks是什么原因。当要释放的内存在使用的时候发生了越界,将这块内存前后的一些信息改掉,就会发生这个错误。malloc和free在debug版下,会在分配的内存前后加上一些额外的信息。大体上是内存的前面32字节是一个结构体,里面记录了分配的内存的大小,4字节的校验位,以及其他信息。内存的后面是4字节的校验位。如果前后的校验位被修改了,就可以知道内存越界了。发生断言错误。在release版下,是没有这些附加信息的。操作系统维护了一个内存分配的链表,里面记录了每段内存的头地址和大小等信息,通过内存的头地址就可以在这个链表中找到到底应该释放多大一块内存。所以下面的代码会出错,原因是传递进的指针地址在内存链表里找不到。
int main() { char *p = (char*)malloc(10); p = p + 1; free(p); return 0; }