zoukankan      html  css  js  c++  java
  • malloc 函数到底做了什么?

    请看下面的代码。

    猜测结果是什么?编译通过吗?

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 
     5 int main()
     6 {   
     7     int i = 2;
     8     char *ptr = NULL;
     9 
    10     while(i-- >0)
    11     {
    12         ptr = malloc(0);
    13         printf("%d, %p
    ", sizeof(ptr), ptr);
    14         
    15         
    16     }
    17 
    18     free(ptr);
    19     ptr = NULL;
    20 
    21     system("pause");
    22     return 0;
    23 }


     

    编译通过,0警告。

    结果如下:

    但是,内存泄露。。。

    WARNING: Visual Leak Detector detected memory leaks! ---------- Block 1 at 0x00A64D78: 0 bytes

    Visual Leak Detector detected 1 memory leak (36 bytes). Largest number used: 72 bytes. Total allocations: 72 bytes.

    为什么?

    再看代码。。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 
     5 int main()
     6 {   
     7     int i = 2;
     8     char *ptr = NULL;
     9 
    10     while(i-- >0)
    11     {
    12         ptr = malloc(0);
    13         ptr = realloc(ptr, 0);
    14         printf("%d, %p
    ", sizeof(ptr), ptr);
    15         
    16         
    17     }
    18 
    19     free(ptr);
    20     ptr = NULL;
    21 
    22     system("pause");
    23     return 0;
    24 }


    猜猜结果是什么?

    内存有泄漏吗?

    No memory leaks detected.

    没有泄露呀。

    如果我把  

        free(ptr);
        ptr = NULL;

    两行代码去掉,会不会泄露呢?


    答案是也不会。

    这完全归功于realloc函数的实现机制。

    那么malloc函数到底做了什么??

    《操作系统》中讲过malloc申请内存的方式,

    这主要是和glibc的内存管理机制有关。glibc中,为每一块内存维护了一个chunk的结构。glibc在分配内存时,glibc先填写chunk结构中内存块的大小,然后是分配给进程的内存。


    chunk ------size
    p------------ content


    在进程释放内存时,只要 指针-4
    便可以找到该块内存的大小,从而释放掉。

    注:glibc在做内存申请时,最少分配16个字节,以便能够维护chunk结构。

    看图:

    +-----+

    |        |----> 这里的数据结构就是保存这块内存有多大之类的信息。

    |        |

    |        |----> 你的指针的位置

    |        |----> 下面是你的数据

     
  • 相关阅读:
    js获取数组最大值或最小值
    echarts 在 vue-awesome-swiper中无法点击
    vue 父子父组件通过props传父页面请求后的数据
    vue 路由对象
    popupwindow
    数据库
    冒泡排序
    xtuils
    版本更新
    清除缓存
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/3570769.html
Copyright © 2011-2022 走看看