malloc指针识别

时间:2014-10-10 13:08:44

标签: c pointers malloc free

所以我有这个赋值来实现我自己的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个字节。检查指针有效性的一个解决方案是从头开始查看堆,看看我是否得到了有问题的标题,但这不是时间效率。谁能告诉我一个更好的方法呢?

2 个答案:

答案 0 :(得分:1)

一个O(1)解决方案是使头部为8个字节而不是4个字节;使用额外的四个字节来表示有效性。例如,它可能是您在其他四个字节中存储的内容的唯一补充。所以你看看标题,如果这些额外的字节包含除标题第一部分的补码之外的任何内容,你知道它不是一个有效的块。

答案 1 :(得分:1)

我看到了两种可能的选择:

  • 保留已分配的指针的链接列表:由memory_alloc填充并由memory_free使用。这样,您可以仔细检查传递给memory_free的内容是否一致。
  • 链接列表可能非常耗时:作为折衷方案,您只需存储内存池开头和结尾的地址,并确保传递给memory_free的指针处于正确的范围内。它远不那么精确,确定但更快。