用C语言实现free()函数

dsekswqp  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(155)

这个问题是migrated从Unix和Linux堆栈交换,因为它可以回答堆栈溢出。Migrated昨天。
有人问我如何在C中实现自定义free()函数来逐个指针清除内存。我尝试用指针算法给出解释,如下所示

int* ptr = malloc(sizeof(int));
int start_addr = ptr;  // Assuming ptr is at 0x0000
int end_addr = ptr+1;  // ptr+1 will increment by size of int, it will be 0x0004
int size = end_addr - start_addr;
for (int i=0; i<size; i++)
{
    *(ptr+i) = 0; // clear each bit by resetting it to 0
}

以上将清除C中的预定义数据类型,但随后问题语句再次更改了一点点。char* cptr = malloc(15);如何清除上面给予的特定大小(15)?使用指针算法,我们只能得到1字节的字符指针地址,我们如何知道分配给指针cptr的内存的结束地址?
我已经在谷歌上搜索了解决方案,但是也有使用structure从sratch实现malloc(),然后在自定义malloc()之上实现my_free()。我不希望这样,我们将获得已经指向上面场景中给定的一些大小15的指针,然后我们应该能够清除该指针指向的内存。

mzsu5hc0

mzsu5hc01#

最好不要对现有的malloc执行此操作

所以malloc所做的就是管理堆上的内存,当你调用malloc()时,它会寻找一些它已经管理的内存(但当前未使用),或者将通过系统调用请求更多内存。无论如何,free()并不是要将内存清零。在内部,malloc保留了一些相当复杂的数据结构(其中几个是并行的!),它将指针插入空闲的内存位。这是一个高度优化的系统,包括处理碎片等。
换句话说:* * 不要搞砸了**.你找到的所有解决方案都实现了它们自己的malloc,因为这是唯一有意义的方式。如果你要在那里"插入"你的定制free(),你必须确切地理解malloc使用的数据结构,以及如何获得指向下一个正确空闲块的指针。
如果你想实现一个定制的free(),最好先了解malloc的基础知识,然后再实现一个完整的定制malloc() + free()。记住,这可能只对演示有意义。您将无法像已经存在很长时间的现有实现那样高效(除了一些特殊的上下文)。在这里用glibc malloc internals进行初步阅读。

相关问题