zoukankan      html  css  js  c++  java
  • 关于free如何知道要释放多少内存空间长度的问题

    背景:前两天在面试时,对方问了malloc()申请内存时需要指定申请多大的内存空间,为什么free()释放内存时只需要传递一个指针而不需要指定释放多大的内存空间。

    当时的回答:系统在分配内存时除了分配指定的内存空间外,还有分配用于保存内存空间大小等信息。所以内存释放时不再需要再指定释放多大的内存空间,只需要指定该块内存空间的首地址即可。

    现在就来探讨和研究一下,malloc申请内存空间大小的值到底被保存在哪里了。 

    测试代码:(开发工具:vc++6.0)

     1 #include <stdlib.h>
     2 
     3 #define MEMSET 10
     4 
     5 int main()
     6 {
     7     int i;
     8     int *p = (int *)malloc(sizeof(int) * MEMSET);   // 分配 MEMSET 个int型的内存空间
     9     for (i=0; i<MEMSET; i++)
    10     {
    11         *(p+i) = i;    // 只是简单的赋值,没特别用意
    12     }
    13     free(p);
    14     p = NULL;
    15     return 0;
    16 }

    调试代码并调出内存监控器。可以看出申请内存空间的首地址为:0x00200F28。申请内存大小为:4×10=40(十进制)

    在该内存块首地址前地16个字节的位置有个【28】的数值,而0x28=40(十进制)。可以看出在内存首地址前16个字节处存放了申请内存块大小的数值(实际上我测试了多组数据,得出的结论都是一样的)。

    参考内容:

    void *malloc( size_t size ); // 参数size为需要申请内存空间的数量

    void free( void* memblock ); // 参数memblock为需要释放内存的指针

  • 相关阅读:
    08.3 属性描述符__get__ __set__ __delete__
    08.2 __getattr__ 和 __getattribute__
    08.1 property 装饰器
    appium脚本编写,元素定位,隐式等待
    appium的安装和介绍
    docker镜像构建
    dockerfile的语法和指令
    docker的registry介绍
    docker-compose使用
    docker部署Jenkins
  • 原文地址:https://www.cnblogs.com/hezhixiong/p/4535534.html
Copyright © 2011-2022 走看看