2008-09-23 20 views
9

我想在鏈接時使用自定義malloc替換默認的malloc。但是,當我試圖在我的程序重新定義的malloc,我得到這個錯誤:有沒有辦法在Windows上的鏈接時重新定義malloc?

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

這完全適用於任何Unix,它適用於Windows與大多數功能,但不能使用malloc。我怎樣才能做到這一點?與malloc不同的是,它不允許覆蓋它?

我知道我可以用我的自定義malloc替換malloc的每個調用,或使用宏來做到這一點,但我寧願不修改每個第三方庫。

回答

15

還有就是這是在這裏有多難真的好討論:

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

顯然,你需要修補CRT

編輯:實際上,一個MS員工給了技術,討論。你需要將你的malloc移動到一個lib中,然後在CRT之前將它鏈接起來「他還提到,如果你將你的malloc作爲lib 鏈接到之前,那麼CRT(即確保打開'ignore default libs '並明確包括CRT),你會得到你想要的,並且可以毫無問題地重新分配這個lib。「

+0

在同一個討論中提到「crt之前的庫」方法不能可靠地使用像(strdup) – Weidenrinde 2009-05-13 09:12:47

+0

這樣的函數,那麼`_CrtSetAllocHook`如何:https://msdn.microsoft.com/en-us/library/ cy8c7wz5.aspx – dashesy 2016-08-08 04:53:05

2

我認爲這取決於鏈接文件的順序。我認爲你需要先鏈接你的自定義函數,然後是導入庫。

+0

這是正確的 - 他需要malloc的第一位置移動到lib下,打開「忽略默認庫」,然後鏈接到CRT明確。 – 2008-09-23 12:31:36

1

從3.0版本開始,Firefox使用自定義分配器(AFAIR jmalloc) - 你可以檢查他們是如何做到的。我讀到他們遇到了一些問題。你可以檢查這個blog post

1

如何在項目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); } 
... 
相關問題