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

时间:2011-02-25 18:50:09

标签: c memory

  

可能重复:
  How do free and malloc work in C?

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

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

每次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
  ...
}

答案 4 :(得分:0)

答案是特定于实现的。

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