先来段代码:
的注释,运行后会报错:
各种百思不得其解啊... 各种百度各种头疼后,突然顿悟,原来是realloc的原因。前几天看realloc的原型时,把
extern void *realloc(void *mem_address, unsigned int newsize);
看错成:
extern void realloc(void *mem_address, unsigned int newsize);
结果导致找了好久的错。
这一行应该改为
也就是说,malloc(114)使得原有的malloc后面的块不足以分配(200-100)大小的内存,于是realloc找到了一块新的内存,把原来的内存数据搬运到新的内存中,原内存在realloc内被释放掉了,而当运行第二次的realloc时,realloc内部再次进行 "找新内存 → 搬家 → free原内存” 的过程,因此出现了二次free的情况。
01 | #include <stdio.h> |
02 | #include <malloc.h> |
03 |
04 | #define DEBUG() printf("lines: %d\n", __LINE__); fflush(stdout); |
05 |
06 | int 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: ======== |
11 | 00746000-00760000 r-xp 00000000 08:02 4196833 /lib/ld-2.5.so |
12 | 00760000-00761000 r-xp 00019000 08:02 4196833 /lib/ld-2.5.so |
13 | ………… |
extern void *realloc(void *mem_address, unsigned int newsize);
看错成:
extern void realloc(void *mem_address, unsigned int newsize);
结果导致找了好久的错。
解决方法:
1 | realloc (p, 200); |
1 | p = realloc (p, 200); |