为什么不';当我提供自己的malloc和free时,我不会得到链接错误吗?

为什么不';当我提供自己的malloc和free时,我不会得到链接错误吗?,c,libc,C,Libc,我正在尝试实现一个简单的fit first内存管理算法。所以我有一个自己的C文件 void* malloc(size_t) 及 使用gcc生成.out文件时,我预期会出现链接错误,因为它会与现有的标准实现冲突。但是我的文件链接很好 请帮助我理解。根据我的经验,对自定义malloc和free进行唯一命名是标准做法,例如内核malloc、kmalloc和内核free、kfree。如果您正在编写自己的函数,我建议为您的函数指定一个单独的名称 您计划如何分配内存?大多数情况下,您应该围绕mall

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

   void* malloc(size_t)

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


请帮助我理解。

根据我的经验,对自定义malloc和free进行唯一命名是标准做法,例如内核malloc、kmalloc和内核free、kfree。如果您正在编写自己的函数,我建议为您的函数指定一个单独的名称

您计划如何分配内存?大多数情况下,您应该围绕malloc函数来提供自定义功能,但最终还是以某种形式使用malloc。在我看来,这是您应该采取的路线,因此我不会太匆忙地处理内置的malloc和free函数,除非您有充分的理由(或强烈的愿望)这样做。将它们命名为同一名称会影响这一点

,只是让你感觉到你在看什么

我希望出现链接错误,因为它将与现有的标准实现冲突

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

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

UNIX共享库是专门为模拟归档库而设计的,因此,尽管使用
libc.so
链接时没有出现链接错误的详细信息有所不同,但其精神是相同的


但是,您还没有完成。将任何中等复杂的程序与您的实现链接可能会崩溃,因为当您更换
malloc
时,您还需要实现
realloc
,并且可能需要
calloc
memalign
posix_memalign
。否则,您将得到一个混合的实现,当有人将
realloc
ed指针传递到您的
free
,事情很可能会爆炸。

我认为使用链接顺序以这种方式“覆盖”例程是可以接受的做法,因此默认情况下没有链接错误/警告,但是它真的运行你的代码吗?GCC的malloc和free内置项可能会覆盖您的。@IBY:好的观点-OP可能需要
-fno-builtin
-fno-builtin-malloc-fno-builtin-free
来确保调用他的例程。那么,您在哪个系统上?如果这是在linux上,那么glibc中的malloc/etc是弱符号,这意味着您可以用自己的符号覆盖它们。看这里:
   void free(void*)