double free or corruption的原因(2)

来源:互联网 发布:java list 相同的元素 编辑:程序博客网 时间:2024/06/13 08:55
先来段代码: 
01#include <stdio.h>
02#include <malloc.h>
03 
04#define DEBUG() printf("lines: %d\n", __LINE__); fflush(stdout);
05 
06int main(void)
07{
08   void* p = malloc(100);
09   DEBUG();
10 
11   //void* p2 = malloc(114);
12   DEBUG();
13 
14   realloc(p, 200);
15   DEBUG();
16 
17   realloc(p, 300);
18   DEBUG();
19 
20   return 0;
21}

gcc main.c -o main  && ./main

运行后无误,然后去掉

1//void* p2 = malloc(114);
的注释,运行后会报错: 
01…………
02*** glibc detected *** ./main: double free or corruption (!prev): 0x09211008 ***
03======= Backtrace: =========
04/lib/libc.so.6[0x7cd5a5]
05/lib/libc.so.6[0x7cf7bc]
06/lib/libc.so.6(realloc+0xe6)[0x7d0386]
07./main[0x80484ec]
08/lib/libc.so.6(__libc_start_main+0xdc)[0x779e9c]
09./main[0x8048381]
10======= Memory map: ========
1100746000-00760000 r-xp 00000000 08:02 4196833    /lib/ld-2.5.so
1200760000-00761000 r-xp 00019000 08:02 4196833    /lib/ld-2.5.so
13…………
各种百思不得其解啊... 各种百度各种头疼后,突然顿悟,原来是realloc的原因。前几天看realloc的原型时,把 
extern void *realloc(void *mem_address, unsigned int newsize); 
看错成: 
extern void realloc(void *mem_address, unsigned int newsize); 
结果导致找了好久的错。


解决方法:

1realloc(p, 200);
这一行应该改为
1p = realloc(p, 200);
也就是说,malloc(114)使得原有的malloc后面的块不足以分配(200-100)大小的内存,于是realloc找到了一块新的内存,把原来的内存数据搬运到新的内存中,原内存在realloc内被释放掉了,而当运行第二次的realloc时,realloc内部再次进行 "找新内存 → 搬家 → free原内存” 的过程,因此出现了二次free的情况。
0 0