我是靠谱客的博主 仁爱花卷,最近开发中收集的这篇文章主要介绍c语言 malloc_C语言杂记:malloc(0)是什么行为linux手册上的说明glibc的实现验证总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

可以看到占用了15.7M内存

现在把N改成10N

for(i = 0; i 10000000; i++) {
    addr = malloc(0);   
}
b849e3d8c8458df7ea7a5b00b439f9a1.png

可以看到,占用了157M内存

总结

malloc(0)并不是什么都不分配,会分配chunk来进行元数据管理。这也是为什么malloc(0)出来的指针,永远可以被安全的free掉的原因

最后

以上就是仁爱花卷为你收集整理的c语言 malloc_C语言杂记:malloc(0)是什么行为linux手册上的说明glibc的实现验证总结的全部内容,希望文章能够帮你解决c语言 malloc_C语言杂记:malloc(0)是什么行为linux手册上的说明glibc的实现验证总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部