关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

提出问题:

如题,通过malloc开辟的空间,在开辟时会指定空间大小,但是在调用free时,却没有指定空间大小,那free函数时如何确定即将被释放的空间的大小的呢?

分析问题:

既然在调用free(p)函数释放空间的时候不需要输入空间大小的信息,那么很有可能在与指针p关联的内存中存储着空间的大小信息, 果断百度了一把,大家的说法是在即将被释放的首地址p的前面的低地址空间中存储着空间的大小信息。

解决问题:

- 在机器上做个测试,打断点,查看内存

-环境 win32 + vs2017 

测试一 :

关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

测试二:

关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

测试三:

关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

测试四:

关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

测试五:

关于通过 malloc 开辟的空间在调用free函数时free函数是如何确定释放空间大小的

总结问题:

在win32+vs2017的环境下,调用malloc开辟空间的同时,malloc会返回一个指针p,在指针p的后面(地址高于指针p的方向)为新开辟的空间,而在指针p的前边(地址低于指针p的方向)12个字节处,会有4个字节记录开辟空间的大小(对应测试五截图中的绿色椭圆圈住的位置)。

拓展问题:

1. 在记录开辟空间大小的地址和开辟空间的首地址之间有8字节,在测试中为这8个字节存储了同一样的存储内容(对应测试五截图中的红色方框圈住的位置),这一点比较诡异,暂未搞清楚含义,怀疑是个标志位或是校验位之类的东西。

2. 暂未明确这种记录malloc空间大小的方式是否是编译器的行为。