重载免费(),所以我的程序使用我的而不是系统的

为了教育目的,我需要重新编码free()函数,它也必须被命名为free()

当我重命名我的函数myfree()它完美的工作,但是当我命名它free()程序不知道他是否需要使用我的系统的程序只是Segmentation fault(core dumped)即使我不打电话给我的自由(只是另一个free()function的声明似乎崩溃了)

所以我怎么能告诉编译器使用我的而不是系统的?

谢谢你提前。

编辑:Linux操作系统

Solutions Collecting From Web of "重载免费(),所以我的程序使用我的而不是系统的"

基本上,你有三个选择,我可以看到

  • 在编译期间重定向它,例如使用#define作为@Mohamed建议。
  • 使用LD_PRELOAD在运行时更改它。
  • 使用malloc钩子修改现有的malloc / free。

如果您使用GCC,则可以使用编译器来帮助您。 当你编译时,将其包含在你的链接上: -Xlinker --wrap=free 。 这将把所有的调用重定向到free()来使用你必须提供的__wrap_free() 。 如果你想调用原来的free()函数,它仍然在那里,但改名; 你可以调用__real_free()

这将捕获您链接的预编译库,宏不能做(但LD_PRELOAD可以)。

使用宏来强制程序使用你的myfree()函数:

 #define free(X) myfree(X) 

最简单的(不是最安全的)方法是#定义#define free myfree以便预处理器将所有来自free()的调用替换为myfree() 。 另一种更安全的方法是创建一个名为free()的普通函数,并且不包含库,它也包含free()函数。

如果你正在寻找一个标准的方式,恐怕它不存在。 重新定义标准库名称是未定义的行为。

C11,7.1.3.2:

…如果程序在保留的上下文中声明或定义了一个标识符(除了7.1.4所允许的),或者定义了一个保留的标识符作为宏名称,那么这个行为就是未定义的。

在7.1.4中,关于库如何定义一个与函数同名的宏以及如何绕过这个宏有一个很长的解释。 没有迹象表明用户如何覆盖标准库函数。

你也可以看到这个问题的更多信息。

在其他答案中可以找到非标准的方法。