概述
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
int main(){
void* addr;
long long int i = 0;
for(i = 0; i 1000000; i++) {
addr = malloc(0);
}
sleep(1000);
}
![1758a4f026dba6ef24dad68d19f7c831.png](https://file2.kaopuke.com:8081/files_image/2023061122/1758a4f026dba6ef24dad68d19f7c831.png)
可以看到占用了15.7M内存
现在把N改成10N
for(i = 0; i 10000000; i++) {
addr = malloc(0);
}
![b849e3d8c8458df7ea7a5b00b439f9a1.png](https://file2.kaopuke.com:8081/files_image/2023061122/b849e3d8c8458df7ea7a5b00b439f9a1.png)
可以看到,占用了157M内存
总结
malloc(0)
并不是什么都不分配,会分配chunk来进行元数据管理。这也是为什么malloc(0)
出来的指针,永远可以被安全的free
掉的原因
最后
以上就是仁爱花卷为你收集整理的c语言 malloc_C语言杂记:malloc(0)是什么行为linux手册上的说明glibc的实现验证总结的全部内容,希望文章能够帮你解决c语言 malloc_C语言杂记:malloc(0)是什么行为linux手册上的说明glibc的实现验证总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复