c语言 - 重载free(),所以我的程序使用我的而不是系统的



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

当我将函数重命名为myfree()时,它可以完美地工作,但当我将其命名为free()时,程序不知道他是否需要使用我的函数或系统的函数,所以即使我不调用free,程序也只有Segmentation fault(core dumped)(只是另一个free()函数的声明似乎会使其崩溃)

那么,我如何告诉编译器使用我的而不是系统的呢?

提前谢谢你。

编辑:Linux操作系统

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

  • 在编译时重定向它,例如使用@Mohamed建议的#define
  • 在运行时使用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中,对库如何定义与函数同名的宏以及如何绕过该宏进行了详细解释。没有指示用户可以如何覆盖标准库函数。

您也可以查看此问题以获取更多信息。

当然,非标准的方法总是可能的,正如你在其他答案中所能找到的那样。

相关内容

  • 没有找到相关文章

最新更新