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

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

void* malloc(size_t) 

  void free(void*) 

使用gcc生成.out文件时,我期待链接错误,因为它会与现有的标准实现冲突。 但我的文件链接很好。

请帮我理解。

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

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

然后,链接器可以自由地将malloc.o中的libc.a替换为您的实现。 您可以在此处阅读链接器使用的算法。 一旦理解了算法,就应该清楚为什么链接自己的mallocfree不会导致链接错误。

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

但是,你没有完成。 将任何中等复杂程序与您的实现链接可能会崩溃,因为当您替换malloc ,您需要实现realloc ,并且可能需要callocmemalign以及posix_memalign 。 否则,你将得到各种实现,当有人将realloc ed指针传递给你的free ,事情可能会爆炸。

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

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

这是malloc的Minix实现 ,只是为了让您了解您正在查看的内容。