代码之家  ›  专栏  ›  技术社区  ›  Jazz

有没有办法在Windows上的链接时重新定义malloc?

  •  9
  • Jazz  · 技术社区  · 18 年前

    我想在链接时替换默认malloc以使用自定义malloc。但当我试图在程序中重新定义malloc时,我得到了以下错误:

    MSVCRT.lib(MSVCR80.dll) : error LNK2005: _malloc already defined in test.lib(test.obj)
    

    我知道我可以用我的自定义malloc替换对malloc的每个调用,或者使用宏来实现这一点,但我不希望修改每个第三方库。

    4 回复  |  直到 18 年前
        1
  •  16
  •   Lou Franco    18 年前

    这里有很多关于这有多困难的讨论:

    http://benjamin.smedbergs.us/blog/2008-01-10/patching-the-windows-crt/

    显然,你需要修补CRT

    编辑:事实上,微软的一位员工在讨论中给出了这种技巧。您需要将malloc移动到一个lib,然后在CRT之前链接它

    “他还提到,如果将malloc链接为lib 之前 CRT(即,确保启用“忽略默认库”并明确包含CRT),您将得到您想要的,并且可以毫无问题地重新分发此库。”

        2
  •  2
  •   dguaraglia    18 年前

        3
  •  1
  •   Kasprzol    18 年前

    从3.0版开始,Firefox使用自定义分配器(AFAIR jmalloc)——您可以检查他们是如何做到这一点的。我读到他们有一些问题。你可以查一下这个 blog post .

        4
  •  1
  •   Alex    15 年前

    而不是添加文件,例如:

    my_memory.c
    #undef malloc
    #undef calloc
    ...
    void *_custom_malloc(int size) { return jmalloc(size); }
    void *_custom_calloc(int size) { return jcalloc(size); }
    ...