博客搬家,原地址:https://langzi989.github.io/2017/04/07/free如何知道要free多大的空间/

在C语言中,当向一个函数传递指针的时候,它的长度信息往往会被截断(如果是数组名),传入函数的只是一个指针,而无法标示数组的长度,在函数中我们也无法获取它的长度信息,除非显示的传递一个长度参数。但是使用free函数的过程中,我们只是向free中传递了一个指针,并没有标示它的大小,那free是如何知道将要被free掉的内存的大小呢?下面将详细解答这一问题。

malloc函数的实现是以块分配内存,在被分配的块中包括两部分。第一部分中存储含有报头的元数据,它其中包含有分配块的大小信息,是一个常量;第二部分中存储实际用户数据。而使用malloc分配内存返回的是第二部分用户数据的地址。而块的两个部分在内存中的存储取决有编译器的实现,一般有两种情况,第一种是最常见的,即元数据和用户数据是连续的,存储在连续空间位置。第二种是两部分分开存储。

对于第一种情况,malloc分配内存的空间图如下:

____ The allocated block ____
/                             \
+--------+--------------------+
| Header | Your data area ... |
+--------+--------------------+^|+-- The address you are given

对于上述情况,malloc中内存转换实现方式为:

/* The corresponding word size */
#define SIZE_SZ                (sizeof(INTERNAL_SIZE_T))
...
/* conversion from malloc headers to user pointers, and back */
#define chunk2mem(p) ((void*)((char*)(p) + 2*SIZE_SZ))
#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*SIZE_SZ))

如上源码我们可以看出来,chunk2mem将原始指针转换为user_data的指针,mem2chunk做了相反的转换。这个时候free的实现为:

void free(void* mem) {p = mem2chunk(mem);// Now that you know how large is chunk "p", go ahead and free the chunk.
}

同时,我们通过实验可以推测,标准库对void*的operator=做了重载。

#include <iostream>int main() {int *a = (int*)malloc(sizeof(int));int *b = (int*)malloc(sizeof(int));short *c = (short*)malloc(sizeof(short));std::cout << a << std::endl<< b << std::endl<< c << std::endl;std::cout << b - a << std::endl;std::cout << reinterpret_cast<size_t>(b) - reinterpret_cast<size_t>(a) << std::endl;
}

输出结果为:

0x10b5c20
0x10b5c40
0x10b5c60
8
32

参考:

https://www.quora.com/How-does-free-function-in-C-knows-how-much-memory-to-be-released-deallocate

http://stackoverflow.com/questions/1518711/how-does-free-know-how-much-to-free

C语言free如何知道要free多大的空间相关推荐

  1. 张一鸣批评的互联网“语言腐败”,危害到底有多大?

    张一鸣批评的互联网"语言腐败",危害到底有多大? https://www.toutiao.com/i6945842048234701325/?tt_from=weixin& ...

  2. c语言中输入大数,如何使用C语言实现输入10个数按从大到小的顺序排序输出

    本文主要向大家介绍了如何使用C语言实现输入10个数按从大到小的顺序排序输出,通过具体的内容向大家展示,希望对大家学习C语言有所帮助. 用选择排序法编写c语言,实现从键盘上输入10个数,按从大到小的顺序 ...

  3. Nwafu-OJ-1411 Problem J C语言实习题二——5.按从大到小排序三个数

    问题 J: C语言实习题二--5.按从大到小排序三个数 时间限制: 1 Sec  内存限制: 128 MB 题目描述 从键盘输入三个数,将它们按从大到小进行排序,然后输出. 输入 输入三个数. 输出 ...

  4. c语言中len的作用,C语言 int len( )  求大神解释

    C语言 int len( ) 求大神解释 sen3830058 LV12 2013-03-13 #include int len(char s[]){ int n=0; while(s[n]!='\0 ...

  5. C语言 九九乘法口诀表 实现从大到小排序

    这次用C语言 实现九九乘法口诀表 从大到小排序 个人感觉不完美,望告知 #include <stdio.h>/*实现从大到小*/ int main(void) {int i,j,t;/*定 ...

  6. 有c语言基础学python容易吗_学习Python需要先学C语言吗?0基础学Python难度大吗?

    今天小编要跟大家分享的文章是关于学习Python需要先学C语言吗?0基础学Python难度大吗?想要学习或者了解Python相关知识就来和小编一起看一看本篇文章吧! 1.学Python需要先学C语言吗 ...

  7. python语言的生态库都是官方开发的_放弃Python转向Go语言:我们找到了以下9大理由...

    原标题:放弃Python转向Go语言:我们找到了以下9大理由 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时.今年 Stream 团队的主要编程语言从 Python 转向了 ...

  8. c语言一输入运算就显示错误,大咖都会犯的18个c语言入门错误

    C语言的最大特点是:功能强.使用方便灵活.C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下"灵活的余地". 但由于这个灵活给程序的调试带来了许多不便,尤其对初学 ...

  9. 【C 语言】变量本质 ( 变量概念 | 变量本质 - 内存空间别名 | 变量存储位置 - 代码区 | 变量三要素 )

    文章目录 一.变量概念 二.变量本质 1.变量本质 - 内存别名 2.变量存储位置 - 代码区 3.变量三要素 一.变量概念 变量概念 : 变量 是 既能读 , 又能写 的 内存对象 ; 与 变量 相 ...

最新文章

  1. 枚举 ---- B. Power Sequence[Codeforces Round #666 (Div. 2)][暴力]
  2. SAP PP 启用了MRP Area之后MMBE有什么变化?
  3. 【C 语言】文件操作 ( 写文本文件 | Qt 创建 C 语言命令行项目 )
  4. dubbo 实践笔记
  5. 不想写脚本清理 mongodb 中的垃圾数据,ttlIndex 能帮到你!
  6. linux内核那些事之Sparse vmemmap
  7. Spring Cloud微服务再谈微服务架构(七)
  8. 在思科模拟器上完成基于服务器的AAA实验
  9. FCKEditor在Asp.net环境下的配置安装
  10. 0-1背包问题的简单解释
  11. python plot画图_Python进阶之Matplotlib入门(四)
  12. 斑马打印机linux驱动安装教程,win7系统安装斑马打印机驱动的操作方法
  13. android 微信浮窗实现_Android仿微信文章悬浮窗效果的实现代码
  14. mysql 查找差值最小_mysql获取两个表中日期字段的最小差值
  15. 微信表情图像代表什么意思_微信表情包每个表情代表什么意思
  16. 新手第一次用云渲染如何快速上手
  17. 考研英语为什么要被单词书?
  18. python-操作autocad之pyautocad包
  19. 2009.5.9 GYMUN
  20. 互联网(internet)又称因特网

热门文章

  1. 刷题回顾(持续更新)
  2. 轻量级过程改进之需求管理
  3. 会声会影导出视频跳帧一卡一卡解决办法
  4. 由电影Matrix(骇客帝国)联想到的操作系统知识
  5. python繁简体转换【亲测有效】
  6. 计算机开机壁纸能不能更换,如何修改电脑开机的背景图片
  7. html旅游门票源代码,票务网站整套静态模板 HTML模板
  8. 国内第一创作平台大佬,教你如何写好一篇技术博客?
  9. C语言:输入三角形边长,求面积。
  10. 新浪短链接API接口示例