• 关于free如何知道要释放内存空间的长度问题(X86篇)


    参考:https://blog.csdn.net/fovwin/article/details/8272717?utm_source=blogxgwz0

    参考:https://blog.csdn.net/fovwin/article/details/8452766

    参考:https://www.cnblogs.com/hezhixiong/p/4535534.html

    按照下面这篇文章,我试验了一下,结构和文章中说的不一样:

     malloc长度是10还是192,都是下面的效果。怎么解释?????

    =========================按照下面文章操作的=============================

    在学内存分配的问题的时候,malloc和calloc都要指定需要分配内存的大小,但是free的就不需要,我就纳闷free是咋知道从指针地址开始的多少长度是被分配了的?

    当时就想,在malloc或者calloc的时候,编译器应该把大小的数值放到哪个地方了,当free的时候就去找那个数值,释放掉数值大小的堆空间。

    但是到底放哪呢?

    前几天在网上一阵乱逛,说是现代编译器就是把大小的数值放在分配地址开始的之前位置,但是具体在之前多少位置呢?今天在vs的内存监视器里面看到了。

    测试代码如下:

    #include "stdlib.h"
    #include "stdio.h"
     
    #define Num 100
     
    int main(void)
    {
        int i;
        int *p=(int *)malloc(Num);
        for (i=0;i<Num;i++)
        {
            *(p+i)=1;   //赋值为1只是为了看起来方便
        }
        free(p);
     
        return 0;
    }

    其中p的地址为0x00393220

    接着打开vs2008的内存监视器窗口看:

    有一个地址为0x00393210的很可疑,因为0x64=100

    那么改一下看看:

    #define Num 50

    再看内存监视器:

    看到*(0x00393210)=0x32;即0x32=50

    那应该就是把大小放这里了,就是说距离分配地址0x10之前的位置。

    从中可以看出为什么分配堆更号内存大小(当然它的主要方面还是“碎片”的产生)的一个小方面~~~

    那么calloc又是如何呢?答案就是和malloc一样,把原来的size换成num*size;

    #include "stdlib.h"
    #include "stdio.h"
     
    #define Num 50
     
    int main(void)
    {
        int i;
        int *p=(int *)calloc(Num,Num);
        for (i=0;i<Num;i++)
        {
            *(p+i)=1;
        }
        free(p);
     
        return 0;
    }

    这里的p地址是0x00395008。

    0x9c4=2500(这里有大小端的知识,呵呵,可以看出来x86是小端:MSB存高地址)

    这对于存放内存空间大小的数值是足够的,因为calloc和malloc的函数原型:

    1.  
      void *malloc(size_t size);
    2.  
      void *calloc(size_t num,size_t size);

    ps:size_t在内部被宏定义为unsigned int。

    这样岂不是说calloc可以把整个内存都分配了,那当然不行,如何你申请的堆内存空间过大,则会发生以下错误(vs2008):

    中间那句话很简洁明了吧,至于我输了多大的值,大家可以试试,其实话说在ARM和DSP(针对MCU),堆和栈的大小和起始地址都是可以手动分配的,你当然不能超过了~~~

    但是还有问题:是不是存大小的位置和编译器有关呢?和CPU有关否?

    To Be Continued~~~

    ps:手中刚好有一块Cortex-M3的板子,可以用MDK来编译Debug下就明了了~~~

    ARM篇——http://blog.csdn.net/fovwin/article/details/8452766

  • 相关阅读:
    apache iceberg 1.0 发布
    grafana farowebsdk web 可观测性sdk
    minio 一些配置策略
    cube.js 支持views 模式
    grafana agent 动态配置内部机制简单说明
    parcel segmentation fault 问题以及解决方法
    使用nginx limit_except 保护暴露外网的minio 服务
    grafana phlare 试用
    新版本nexus minio 集成测试
    graylog 索引数据查询处理简单说明
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/14212677.html
Copyright © 2020-2023  润新知