使用malloc申请内存资源后,一般在使用结束后都要调用free将其释放,否则就造成内存资源泄露。
这也是大部分C语言程序员的噩梦。
如果malloc申请了100字节,而用free释放其尾部的50字节会造成什么问题,我们将试图找到这个问题的答案。
理论上说,如果申请了100个字节而只释放了尾部的50字节,会导致前面50字节内存资源没有被释放,从而造成内存泄漏。
下面来用代码看看实际上是不是这样,代码如下:
//file name freePart.c
// gcc freePart.c -g
#include<stdio.h>
#include<stdlib.h>
int main()
{
char * p = NULL;
while(1) {
p = (char *)malloc(100);
printf("p=[%x]\n", p);
if(p) {
free(p+50);
}
}
}
编译:
gcc freePart.c -g
执行:
./a.out
p=[2428010]
*** Error in `./a.out': free(): invalid pointer: 0x0000000002428042 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7cfe1)[0x7ff231c40fe1]
./a.out[0x40060b]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7ff231be5b15]
./a.out[0x4004f9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:03 1125642 /root/ttt/ch1/a.out
00600000-00601000 r--p 00000000 08:03 1125642 /root/ttt/ch1/a.out
00601000-00602000 rw-p 00001000 08:03 1125642 /root/ttt/ch1/a.out
02428000-02449000 rw-p 00000000 00:00 0 [heap]
7ff22c000000-7ff22c021000 rw-p 00000000 00:00 0
7ff22c021000-7ff230000000 ---p 00000000 00:00 0
7ff2319ae000-7ff2319c3000 r-xp 00000000 08:03 33595529 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7ff2319c3000-7ff231bc2000 ---p 00015000 08:03 33595529 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7ff231bc2000-7ff231bc3000 r--p 00014000 08:03 33595529 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7ff231bc3000-7ff231bc4000 rw-p 00015000 08:03 33595529 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7ff231bc4000-7ff231d7a000 r-xp 00000000 08:03 33736640 /usr/lib64/libc-2.17.so
7ff231d7a000-7ff231f7a000 ---p 001b6000 08:03 33736640 /usr/lib64/libc-2.17.so
7ff231f7a000-7ff231f7e000 r--p 001b6000 08:03 33736640 /usr/lib64/libc-2.17.so
7ff231f7e000-7ff231f80000 rw-p 001ba000 08:03 33736640 /usr/lib64/libc-2.17.so
7ff231f80000-7ff231f85000 rw-p 00000000 00:00 0
7ff231f85000-7ff231fa6000 r-xp 00000000 08:03 33736633 /usr/lib64/ld-2.17.so
7ff23218f000-7ff232192000 rw-p 00000000 00:00 0
7ff2321a3000-7ff2321a6000 rw-p 00000000 00:00 0
7ff2321a6000-7ff2321a7000 r--p 00021000 08:03 33736633 /usr/lib64/ld-2.17.so
7ff2321a7000-7ff2321a8000 rw-p 00022000 08:03 33736633 /usr/lib64/ld-2.17.so
7ff2321a8000-7ff2321a9000 rw-p 00000000 00:00 0
7fffb1f40000-7fffb1f61000 rw-p 00000000 00:00 0 [stack]
7fffb1fa0000-7fffb1fa2000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Aborted (core dumped)
从上面的输出可知,只释放一部分资源将导致内存段错误。
至于原因目前还不了解,后续。