2009-12-08 45 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); 
    } 
}