我正在尝试实现一个简单的第一个内存管理算法。所以我有一个带有我自己的
的C文件 void* malloc(size_t)
和
void free(void*)
使用gcc生成.out
文件时,我预计会出现链接错误,因为它会与现有的标准实现冲突。但我的文件链接正常。
请帮助我理解。
答案 0 :(得分:5)
我期待链接错误,因为它会与现有的标准实现冲突。
您的期望是错误的:大多数UNIX libc实现支持使用其他一些malloc。为此,他们将malloc
,realloc
,free
等放入单独的目标文件中,或者将每个文件放入自己的目标文件中。
然后,链接器可以在您的实现中随意替换malloc.o
中的libc.a
。您可以阅读链接器使用的算法here。理解算法后,应该清楚为什么链接自己的malloc
和free
不会导致链接错误。
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,只是为了让您了解自己在看什么。