我想在链接时使用自定义的mallocreplace默认的malloc。 但是当我尝试在我的程序中重新定义malloc时,出现这个错误:
MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in test.lib(test.obj)
这在任何Unix上都可以正常工作,它可以在大多数函数的Windows上运行,但不能在malloc上运行。 我怎样才能做到这一点? 和malloc有什么不同,不允许覆盖它?
我知道我可以用我的自定义mallocreplacemalloc每个调用,或使用macros来做到这一点,但我宁愿不修改每个第三方库。
真的很好讨论这是多么困难:
http://benjamin.smedbergs.us/blog/2008-01-10/patching-the-windows-crt/
显然,你需要修补CRT
编辑:实际上,一位MS员工在讨论中给出了这个技巧。 您需要将您的malloc移动到一个lib,然后在CRT之前将其链接
“他还提到,如果你在CRT 之前把你的malloc作为一个库连接起来(例如确保打开'ignore default libs'并明确包含CRT),你会得到你想要的,并且可以毫无问题地重新分配这个lib “。
我认为这取决于链接文件的顺序。 我想你需要先链接你的自定义函数,然后是导入库。
从版本3.0 Firefox使用自定义分配器(AFAIR jmalloc) – 你可以检查他们是如何做到的。 我读到他们有一些问题。 你可以查看这个博客文章 。
那么在项目makefile中定义malloc = _custom_malloc呢? 比添加一个文件如:
my_memory.c #undef malloc #undef calloc ... void *_custom_malloc(int size) { return jmalloc(size); } void *_custom_calloc(int size) { return jcalloc(size); } ...