C、算法、操作系统杂记《malloc 0大小是什么行为》

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掉的原因

posted @ 2020-08-21 00:14  Velscode  阅读(38)  评论(0编辑  收藏