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