当我提供自己的malloc并且免费时,为什么我没有收到链接错误?

时间:2013-06-10 09:16:51

标签: c libc

我正在尝试实现一个简单的第一个内存管理算法。所以我有一个带有我自己的

的C文件
   void* malloc(size_t)

   void free(void*)

使用gcc生成.out文件时,我预计会出现链接错误,因为它会与现有的标准实现冲突。但我的文件链接正常。

请帮助我理解。

2 个答案:

答案 0 :(得分:5)

  

我期待链接错误,因为它会与现有的标准实现冲突。

您的期望是错误的:大多数UNIX libc实现支持使用其他一些malloc。为此,他们将mallocreallocfree等放入单独的目标文件中,或者将每个文件放入自己的目标文件中。

然后,链接器可以在您的实现中随意替换malloc.o中的libc.a。您可以阅读链接器使用的算法here。理解算法后,应该清楚为什么链接自己的mallocfree不会导致链接错误。

UNIX共享库明确设计用于模拟归档库,因此虽然在与libc.so链接时没有收到链接错误的原因的详细信息不同,但精神是相同的。

然而,你没有完成。将任何中等复杂的程序与您的实施相关联可能会崩溃,因为当您替换malloc时,您 还需要实施realloc,可能calloc和{{ 1}}和memalign。否则,您将获得各种实现,当有人将posix_memalign指针传递给您的realloc时,事情可能会爆炸。

答案 1 :(得分:0)

根据我的经验,自定义mallocs和frees被唯一命名是标准做法,例如内核malloc,kmalloc和kernel free,kfree。如果你自己编写,我建议为你的功能单独命名。

您打算如何分配内存?大多数情况下,您应该使用malloc函数来提供自定义功能,但最终仍会以某种形式使用malloc。在我看来,这是你应该采取的路线,所以除非你有充分的理由(或强烈的愿望),否则处理内置的malloc和免费功能我不会太仓促。让它们命名相同会干扰这一点。

This is the Minix implementation of malloc,只是为了让您了解自己在看什么。