微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

谢谢你提前。

glibc检测到空闲():无效下一个大小(快)

如何找出提供给free()的地址是否是无效地址?

内存释放例程是否触及被释放的块?

将dynamic分配的内存返回到操作系统而不终止程序

使用free()函数的问题

编辑:Linux操作系统

函数readdir中释放(删除)分配的内存

Windows内核中的Free / malloc函数

有没有办法知道在Linux中传递给__free_hook的指针的大小?

C中的问题使用情况

C ++释放内部指针指向作为线程lpParam传递的结构

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

在编译期间重定向它,例如使用#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中,关于库如何定义一个函数同名的宏以及如何绕过这个宏有一个很长的解释。 没有迹象表明用户如何覆盖标准库函数

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐