Sur*_*rya 6 c malloc memory-management
可能重复:
C编程:free如何知道要释放多少?
free()被调用以释放由malloc()函数调用分配的内存.从哪里可以free()找到关于否的信息.由malloc()函数分配的字节数.也就是说,你如何遵守诺言.malloc()由此信息分配的字节和存储的信息.
-Surya
C内存分配函数的大多数实现将内联或单独存储每个块的记帐信息.
一种典型的方式(内联)是实际分配标题和你要求的内存,填充到一些最小尺寸.例如,如果您要求20个字节,系统可能会分配一个48字节的块:
然后给你的地址是数据区的地址.然后,当您释放该块时,free只需获取您提供的地址,并假设您没有填写该地址或其周围的内存,请检查它之前的会计信息.
请记住标头的大小和填充是完全实现定义的(实际上,整个过程是实现定义的,但是inline-accounting-info选项是常见的).
如果您覆盖会计信息中的校验和和特殊标记通常是"内存竞技场已损坏"等错误的原因.填充(为了提高分配效率)是为什么你有时可以写一些超出所请求空间的末尾而不会引起问题(仍然,不要这样做,它是未定义的行为,只是因为它有时有效,没有'这意味着可以这样做).
一个我写的实现malloc在嵌入式系统中你有128个字节,无论你问(这是系统中的最大结构的大小)什么,一个简单的非内联位掩码来决定是否128是否分配了字节块.
我开发的其他人有16个字节块,64个字节块,256个字节块和1K块的不同池,再次使用位掩码来减少会计信息的开销并提高速度malloc和free(不需要合并相邻的自由区块),在我们工作的环境中尤为重要.