2009-12-08 65 views
2

可能重複:
What is the best solution to replace a new memory allocator in an existing code?用C替換函數定義

我在寫C.圖書館,我想知道是否有轉移每malloc()呼叫的方式我的圖書館製作了一個不同的「增強型」testmalloc()函數,我不提供(顯着)修改我的函數庫。這個問題是來自Kernighan和派克的「編程的實踐」,他們說

寫版本的存儲分配器的是故意不早,對代碼進行測試從恢復的P158激發出內存不足錯誤。

我在一個位置,我可以提供一個包裝mymalloc()並在我的圖書館專用。我懷疑在鏈接期間有必要使用這種自由來避免多個符號定義。

+1

許多受騙者,包括http://stackoverflow.com/questions/1519772/what-is-the-best-solution-to-replace-a-new-memory-allocator-in-an-existing-代碼 – 2009-12-08 14:25:33

+0

對這些蠢事抱歉,但是當我搜索這些檔案時他們沒有出現。可能是因爲,儘管我在我的問題中討論了內存分配問題,但我希望能有更通用的解決方案。 – Abysm 2009-12-08 14:31:40

+1

@尼爾:鏈接的問題不完全相同。它主要是關於C++和Linux;對平原C沒有太大幫助 – kgiannakakis 2009-12-08 14:33:29

回答

1

除了Yossarian的回答,您可以使用malloc鉤子,至少爲012定義。

+1

掛鉤工程在msvc太:http://msdn.microsoft.com/en-us/library/cy8c7wz5(VS.80).aspx(但我不知道它:]) – nothrow 2009-12-08 14:29:25

3

是的。你應該包括圖書館,最後,用#定義的malloc mymalloc

例如:

library.h:

void * myalloc(int); 
#define malloc myalloc 

由source.c:

#include <stdlib.h> 
int* i = malloc(4); 

- >使用myalloc

+0

一個問題是程序員可能會期望malloc工作,就像ahem,malloc一樣。總是使用一個名爲myalloc的函數,並將其定義爲生產環境中malloc的別名,但在測試用例中完全不同的函數? – phtrivier 2009-12-08 14:28:07

+0

您可以使用#ifdef DEBUGGING或其他方法在需要時重新定義malloc。默認情況下,重新定位不應該發生 - 對於不知道該技巧的開發人員是沒有壞處的。 – kgiannakakis 2009-12-08 14:31:28

2

我猜寫自己malloc

char* malloc(size_t sz) 
{ 
    return (char*)0; 
} 

,然後在這裏行不通鏈接呢? (注意:你通常可以在鏈接步驟中首先鏈接庫中的函數來替換庫中的函數,但它不會替換庫中的調用,所以庫仍然使用它自己的函數,但是當鏈接程序到達您的版本時,需要鏈接到您自己的代碼的所有鏈接到malloc將使用您的版本。)

+1

它很難鏈接只有一些功能標準庫。 – nothrow 2009-12-08 14:31:24

0

甚至可以編寫一個malloc()實現,該實現可以成功或失敗,具體取決於全局。 Unix連接器不會查找真正的malloc函數,因爲它在目標文件中找到一個函數。我不知道這是如何在Windows上表現的。

void *malloc(size_t aSize) 
{ 
    if (gNextMallocShallFail) 
    { 
    gNextMallocShallFail = 0; //--- next call will succeed 
    return NULL; 
    } 
    else 
    { 
    return realloc(NULL, aSize); 
    } 
}