IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    malloc的内存分配之 malloc(0)的内存分配情况

    techbulo发表于 2015-12-28 12:15:17
    love 0
    
    #include<iostream>
    
    using namespace std;
    
    int main()
    
    {
    
    char *p;
    
    if((p=(char *)malloc(0))==NULL)
    
    puts("got a null pointer");
    
    else
    
    puts("got a valid pointer");
    
    
    }
    
    

    答案:got a valid pointer

    首先:
    在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间。
    其次:
    不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B),因为malloc需要用这部分空间来维护堆上的内存块链表。所以当用户申请一块0B的空间时,malloc实际分配的空间是8B,如果用户申请的空间是X,则malloc实际分配的空间是(对齐(X)   +   8)。这也是为什么malloc分配的空间千万不能越界使用的原因:堆的内部链表结构将被破坏。

    另外对于new和delete malloc和free这样的内存分配与释放函数:到底delete和free是怎么知道要释放掉多少内存的呢?

    其实在new和malloc内存分配成功时,系统出除了返回一个指向这块内存的指针外,还会获得一块用于记录此处分配的内存大小的内存块:

    内存分配

    内存分配



沪ICP备19023445号-2号
友情链接