关于free如何知道要释放内存空间的长度问题
在学内存分配的问题的时候,malloc和calloc都要指定需要分配内存的大小,但是free的就不需要,我就纳闷free是咋知道从指针地址开始的多少长度是被分配了的?
当时就想,在malloc或者calloc的时候,编译器应该把大小的数值放到哪个地方了,当free的时候就去找那个数值,释放掉数值大小的堆空间。
但是到底放哪呢?
前几天在网上一阵乱逛,说是现代编译器就是把大小的数值放在分配地址开始的之前位置,但是具体在之前多少位置呢?今天在vs的内存监视器里面看到了。
测试代码如下:
有一个地址为0x00393210的很可疑,因为0x64=100
那么改一下看看:
看到*(0x00393210)=0x32;即0x32=50
那应该就是把大小放这里了,就是说距离分配地址0x10之前的位置。
从中可以看出为什么分配堆更号内存大小(当然它的主要方面还是“碎片”的产生)的一个小方面~~~
那么calloc又是如何呢?答案就是和malloc一样,把原来的size换成num*size;
0x9c4=2500(这里有大小端的知识,呵呵,可以看出来x86是小端:MSB存高地址)
这对于存放内存空间大小的数值是足够的,因为calloc和malloc的函数原型:
中间那句话很简洁明了吧,至于我输了多大的值,大家可以试试,其实话说在ARM和DSP(针对MCU),堆和栈的大小和起始地址都是可以手动分配的,你当然不能超过了~~~
但是还有问题:是不是存大小的位置和编译器有关呢?和CPU有关否?
To Be Continued~~~
ps:手中刚好有一块Cortex-M3的板子,可以用MDK来编译Debug下就明了了~~~