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结构。

    看图:

    +-----+

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

    |        |

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

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

     
  • 相关阅读:
    关于求 p_i != i and p_i != i+1 的方案数的思考过程
    poj 3041 Asteroids 二分图最小覆盖点
    poj 1325 Machine Schedule 最小顶点覆盖
    poj 1011 Sticks 减枝搜索
    poj 1469 COURSES 最大匹配
    zoj 1516 Uncle Tom's Inherited Land 最大独立边集合(最大匹配)
    Path Cover (路径覆盖)
    hdu 3530 SubSequence TwoPoint单调队列维护最值
    zoj 1654 Place the Rebots 最大独立集转换成二分图最大独立边(最大匹配)
    poj 1466 Girls and Boys 二分图最大独立子集
  • 原文地址:https://www.cnblogs.com/hdu-2010/p/3570769.html
Copyright © 2011-2022 走看看