zoukankan      html  css  js  c++  java
  • C语言malloc和free实现原理

    以下是一段简单的C代码,malloc和free到底做了什么?

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. int main()  
    2. {  
    3.     char* p = (char*)malloc(32);  
    4.     free(p);  
    5.     return 0;  
    6. }  

    malloc和free的debug和release版本实现各不相同,而且相差很大。

    Debug版本

    malloc需要分配的内存会比实际的size多36byte。最终分配的内存块如下:
     
     
    _CrtMemBlockHeader是一个双向链表结构,其定义如下:
    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. <pre name="code" class="cpp">typedef struct _CrtMemBlockHeader  
    2. {  
    3.     struct _CrtMemBlockHeader *pBlockHeaderNext;    //下次分配的内存块  
    4.     struct _CrtMemBlockHeader *pBlockHeaderPrev;    //上次分配的内存块  
    5.     char *szFileName;               //分配内存代码的文件名  
    6.     int nLine;                  //分配内存代码的行号  
    7.     size_t nDataSize;               //请求的大小,如实例中的32  
    8.     int nBlockUse;                  //请求的内存类型,如实例中的user类型  
    9.     long lRequest;                  //请求id,每次请求都会被记录  
    10.     unsigned char gap[nNoMansLandSize];     //4字节校验位  
    11. } _CrtMemBlockHeader;  
    
    
     
    用户请求内存前后分别有4字节的校验位,分配内存后都会被初始化为0xFD。如果这8个字节被改写,free时就会触发断言失败。
    而请求的32字节会被初始化为0xCC(和栈的初始化一样)。
    系统通过记录这些信息就能显示的给出错误。比如越界访问请求的内存在debug下会断言失败,release下面则不会,从而这会给程序埋下巨大的隐患。很多在release下偶发的错误就是这样产生的。
    _CrtMemBlockHeader总共32字节,加上用户请求的32字节及最后4字节校验位是68字节。最终调用系统的API请求内存。比如Windows下面是HeapAlloc。
     
    如果内存分配失败,malloc不像new那样可以调用new_handler来处理,它直接返回NULL。
     
    free则是对_CrtMemBlockHeader的信息做清理操作,检查校验位等等。最终调用系统API释放内存。比如Windows下面是HeapFree。
     

    Release版本

    实际分配的内存等于请求的内存大小。malloc和free只是在系统API之上做了些判断操作。
     

    总结

    C语言是跨平台的,最终的内存处理都是交给系统API完成。系统会记录每一块分配内存的地址,大小,释放情况等等。所以free时只需要传一个地址的参数就可以了。而且同一个地址不能释放两次。
    http://blog.csdn.net/passion_wu128/article/details/38964045
  • 相关阅读:
    Linux查看内容命令[持续添加]
    android4.0 x86下载编译简介
    android4.0 x86 裁剪与定制
    Android4.0 x86源码结构,生成目录结构
    android4.0 x86编译生成文件系统镜像system.img结构简介
    [翻译]Mootools 1.2新特性(一):元素存储(Element Storage)
    ASP.NET MVC Preview 3 STEP BY STEP 文章管理实例(一)
    Microsoft Speech API SDK
    PB串口编程资料MSCOMM32参数基本介绍
    Microsoft Speech API Overview(SAPI 5.4)
  • 原文地址:https://www.cnblogs.com/findumars/p/5006168.html
Copyright © 2011-2022 走看看