所以我有这个赋值来实现我自己的malloc并在C中释放。问题是memory_free(void *ptr)
函数的要求之一。如果指针无效,它必须返回1,即它没有被memory_alloc(unsigned int size)
分配,否则返回0。我只是无法找到一种方法来做到这一点,而不是绝对时间效率低下。
所以我的内存结构是这样的:我有一个指向数组开头的全局指针,我可以充当堆。每个内存块都有一个int
标题来告诉它的大小以及它是否空闲。
这是我的memory_free(void * ptr)函数,TYPE为typedef unsigned int
:
int memory_free(void *ptr)
{
void *head = ptr;
if (head == NULL)
return 1;
head -= sizeof(TYPE);
if (!((*(TYPE*) head) & 1 ))
return 1;
(*(TYPE*) head) &= ~0x1;
return 0;
}
指针ptr
指向用户块的第一个字节,这意味着如果我想读取标题,我必须返回4个字节。检查指针有效性的一个解决方案是从头开始查看堆,看看我是否得到了有问题的标题,但这不是时间效率。谁能告诉我一个更好的方法呢?
答案 0 :(得分:1)
一个O(1)解决方案是使头部为8个字节而不是4个字节;使用额外的四个字节来表示有效性。例如,它可能是您在其他四个字节中存储的内容的唯一补充。所以你看看标题,如果这些额外的字节包含除标题第一部分的补码之外的任何内容,你知道它不是一个有效的块。
答案 1 :(得分:1)
我看到了两种可能的选择:
memory_alloc
填充并由memory_free
使用。这样,您可以仔细检查传递给memory_free
的内容是否一致。memory_free
的指针处于正确的范围内。它远不那么精确,确定但更快。