free如何知道在程序中调用时要释放多少字节的内存?
答案 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)
答案是特定于实现的。
free()
不是一般用途,而是完全无操作,实际上并没有跟踪。