zoukankan      html  css  js  c++  java
  • 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掉的原因

  • 相关阅读:
    线程中断总结
    线程的基本协作和生产者消费者
    synchronized总结
    线程基础总结
    Java集合总结(三):堆与优先级队列
    Java集合总结(二):Map和Set
    Java集合总结(一):列表和队列
    java枚举类型总结
    java 内部类简单总结
    java Integer包装类装箱的一个细节
  • 原文地址:https://www.cnblogs.com/velscode/p/13538823.html
Copyright © 2011-2022 走看看