关于C语言中free()的问题

可能重复:
free和malloc如何在C中工作?

free如何知道在程序中调用时要释放多少字节的内存?

这是特定于实现的,但是当调用malloc时,分配的内存的大小保持在某处(通常偏离指针本身)。 当调用free ,它将使用存储的大小。

这正是你应该只对malloc返回的指针调用free原因。

它是自动完成的。 相应的“malloc”已将大小保存在一个秘密位置(通常存储在距指针的负偏移处)。

当然,这意味着您只能释放与之前由“malloc”分配的块相对应的内存。

询问它如何知道“要释放多少字节”是一个错误。 这并不是说每个字节都单独附加了一个空闲/非空闲状态位(好吧,它可以 ,但这将是一个糟糕的实现)。 在许多实现中,分配中的字节数可能完全不相关; 它是用于管理相关的数据结构。

这是一个可以实现的细节,并且会因不同平台而异。 这是一个如何实现它的例子。

每个free呼叫必须与知道大小请求的malloc / realloc呼叫配对。 malloc的实现可以选择将此大小存储在返回的内存的偏移量中。 比如说,通过分配比请求更大的缓冲区,填充前面的大小,然后将偏移量返回到分配的内存中。 然后, free函数可以简单地使用所提供指针的偏移来发现要释放的大小。

例如

 void* malloc(size_t size) { size_t actualSize = size + sizeof(size_t); void* buffer = _internal_allocate(actualSize); *((size_t*)buffer) = size; return ((size_t*)buffer) + 1; } void free(void* buffer) { size_t* other = buffer; other--; size_t originalSize = *other; // Rest of free ... } 

答案是特定于实现的。

  • malloc可能会保留一个将地址映射到数据记录的字典
  • malloc可能会分配比请求稍大的块,并在它实际返回的块之前或之后存储元数据。
  • 在一些特殊情况下, free()不是一般用途,它完全是一种无操作,它实际上并没有跟踪。