在C中实现free()函数



有人问我一个问题,如何在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字节的char指针地址,我们如何知道为指针cptr分配的内存的结束地址?

我已经在谷歌上搜索了解决方案,但也有使用structure从sratch实现malloc(),然后在自定义malloc()之上实现my_free()。我不想这样,我们会得到一个指针,它已经指向上面场景中给定的某个大小15,然后我们应该能够清除该指针指向的内存。

最好不要对现有的malloc这样做

所以malloc所做的就是管理堆上的内存。当您调用malloc()时,它将查找一些已经管理(但当前未使用)的内存,或者通过系统调用请求更多内存。无论如何,free()并不是要将内存归零。在内部,malloc保留了一些相当复杂的数据结构(其中几个并行!),将指针插入空闲的内存中。这是一个高度优化的系统,包括处理碎片等

换句话说:不要搞砸。您找到的所有解决方案之所以实现自己的malloc,是因为这是唯一有意义的方法。如果你要";插入";你的自定义free(),你必须准确地理解malloc使用的数据结构,以及如何获得指向下一个正确空闲块的指针。

如果你想实现一个自定义的free(),那么最好先了解malloc的基础知识,然后实现一个完整的自定义malloc()+free()。请记住,这可能只对演示有意义,您不会像已经存在很长时间的现有实现那样高效(除了一些特殊的上下文)。在这里初步阅读glibcmalloc的内部结构。

最新更新