请看下面的代码。
猜测结果是什么?编译通过吗?
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 int main() 6 { 7 int i = 2; 8 char *ptr = NULL; 9 10 while(i-- >0) 11 { 12 ptr = malloc(0); 13 printf("%d, %p\n", sizeof(ptr), ptr); 14 15 16 } 17 18 free(ptr); 19 ptr = NULL; 20 21 system("pause"); 22 return 0; 23 }
编译通过,0警告。
结果如下:
但是,内存泄露。。。
WARNING: Visual Leak Detector detected memory leaks! ---------- Block 1 at 0x00A64D78: 0 bytes
Visual Leak Detector detected 1 memory leak (36 bytes). Largest number used: 72 bytes. Total allocations: 72 bytes.
为什么?
再看代码。。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 5 int main() 6 { 7 int i = 2; 8 char *ptr = NULL; 9 10 while(i-- >0) 11 { 12 ptr = malloc(0); 13 ptr = realloc(ptr, 0); 14 printf("%d, %p\n", sizeof(ptr), ptr); 15 16 17 } 18 19 free(ptr); 20 ptr = NULL; 21 22 system("pause"); 23 return 0; 24 }
猜猜结果是什么?
内存有泄漏吗?
No memory leaks detected.
没有泄露呀。
如果我把
free(ptr);
ptr = NULL;
两行代码去掉,会不会泄露呢?
答案是也不会。
这完全归功于realloc函数的实现机制。
那么malloc函数到底做了什么??
《操作系统》中讲过malloc申请内存的方式,
这主要是和glibc的内存管理机制有关。glibc中,为每一块内存维护了一个chunk的结构。glibc在分配内存时,glibc先填写chunk结构中内存块的大小,然后是分配给进程的内存。
chunk ------size
p------------ content
在进程释放内存时,只要 指针-4
便可以找到该块内存的大小,从而释放掉。
注:glibc在做内存申请时,最少分配16个字节,以便能够维护chunk结构。
看图:
+-----+
| |----> 这里的数据结构就是保存这块内存有多大之类的信息。
| |
| |----> 你的指针的位置
| |----> 下面是你的数据
malloc 函数到底做了什么?,布布扣,bubuko.com
原文:http://www.cnblogs.com/hdu-2010/p/3570769.html