malloc(0)是什么都不分配吗?为什么malloc(0)会返回一个指针,并且这个指针可以被安全的free呢?
linux手册上的说明
If size is 0,
then malloc() returns either NULL, or a unique pointer value
that can later be successfully passed to free().
意思是如果传入的size为0,则返回NULL或者一个指针,该指针可以正确的被free调用
那么该指针到底指向什么呢?
glibc的实现
/malloc/malloc.c 492行
malloc(size_t n)
If n is zero, malloc returns a minumum-sized chunk. (The minimum
size is 16 bytes on most 32bit systems, and 24 or 32 bytes on 64bit
systems.)
说明了,如果传入size大小为0,则返回一个最小大小的chunk(在32为系统上16字节,在64位系统上24或者32字节)
验证
该行为可以直接在windows上进行验证
循环N次,每次malloc(0),然后让进程暂停住,打开任务管理器查看内存占用
#include <stdio.h>
int main()
{
void* addr;
long long int i = 0;
for(i = 0; i < 1000000; i++) {
addr = malloc(0);
}
sleep(1000);
}
可以看到占用了15.7M内存
现在把N改成10N
for(i = 0; i < 10000000; i++) {
addr = malloc(0);
}
可以看到,占用里157M内存
总结
malloc(0)
并不是什么都不分配,会分配chunk来进行元数据管理。这也是为什么malloc(0)
出来的指针,永远可以被安全的free
掉的原因