2010-09-27 66 views
2

我有以下问题:C/C++ - 覆盖默认功能

难道微软的Visual Studio (我用2008 SP1)提供任何方法来覆盖非标准C函数,如mallocmemcpy

假设我有一些外部构建的库,其中包含malloc.objmemcpy.obj。 库被称为library.lib

我应该如何建立自己的项目,以便编译器使用的malloc()我(重写)版本和memcpy()程序,而不是提供的(我假设它们共享相同的语法)

整个这件事的关键是要改变我的项目中的每个malloc而不使用名称别名如my_malloc或类似的名称,以便我可以比较性能。

这可能吗?

谢谢。

+0

显然,这个问题是可以在这里标记'C/C++':)的其中一个问题:) – 2010-09-27 20:20:06

+0

这是一个特定于实现的问题,所以我将您的平台添加到标记。没有标准的方法来做到这一点(虽然有标准的方法来做到这一点),所以它将取决于编译器和构建系统。 – 2010-09-27 20:31:35

回答

1

还没有尝试过,但 - 在项目属性 - >连接器 - >输入,将'忽略所有默认库'设置为是。然后设置'Additional Dependencies'= library.lib; libcmt.lib。

这应该包括你的图书馆之前的标准静态CRT。提供的功能链接是相同的,每个应该做你想做的。尽管在两个静态库中如何将malloc/free链接到操作系统可能会有问题。我认为library.lib还重新定义了realloc/free/calloc等?

+1

如果你这样做,那么你会失去这些库实现的一切,而不仅仅是malloc! – 2014-03-12 23:54:06

8

是否可以更改构建和链接过程,以便替换memcpymalloc的实现?是。这是个好主意吗?不是真的。

你会更好,只是用#define逻辑,这些功能重命名为类似memcpy_testingmalloc_testing,然后有一个单一#define这两个之间切换。这样,你的解决方案更容易移植到其他编译系统中,而其他编程人员更清楚地知道你在做什么。

编辑: 与意见一致,这里是你在共享的头文件做一个样本:

#ifdef testing 
# define my_malloc(n) testing_malloc(n) 
#else 
# define my_malloc(n) malloc(n) 
#endif 

在有需要时你可以甚至支持运行时切换使用函数指针:

void *(__cdecl *my_malloc)(size_t); 
// ... 
void SetToTest() { my_malloc = testing_malloc; } 
void SetToStandard() { my_malloc = malloc; } 
+0

我不同意'#define malloc(n)my_malloc(n)'会立即清除。实际上,在代码本身中进行搜索/替换会更清晰。用'#define'代替甚至可能是危险的:例如,查看代码网站,很难判断它是调用系统实现还是自己调用,因此很难判断使用哪个释放器。如果与仍然使用系统'malloc'的代码链接(或者某些项目忽略使用'#define'),这会更成问题。 – jamesdlin 2010-09-27 21:29:05

+1

我认为我的重命名和你的想法是相反的:我建议在代码中编写'my_malloc',以清楚地明白某些奇怪的事情正在进行,并在头文件中写入'#ifdef testing' /'#define my_malloc(n)testing_malloc(n)'/'#else' /'#define my_malloc(n)malloc(n)'''#endif'。 – Reinderien 2010-09-27 21:34:20

+0

啊,好的。是的,我同意这样更好。 (我将“这些函数”解释为“memcpy”和“malloc”,而不是自定义实现。) – jamesdlin 2010-09-27 21:36:13

1

你可以建立自己的Visual C++的C运行时包含memcpymalloc功能(其中包括)库(CRT)的版本,从源代码通常可在\Program Files\Microsoft Visual Studio 9.0\VC\crt中找到。然后将您的程序与自定义CRT相链接。

或者,您可以使用this官方文章中的技术来挂钩分配函数。在实施NedMalloc的是一个自定义分配器NedMalloc他似乎只是使用的#define nedmalloc的malloc

头文件说,它应该工作在Windows上

0

展望。

还有囤积在hoard它是开源的,所以你可以看看他们是如何做到的。

C++也存在问题。如果windows包括将new运算符定义为仅在下面使用malloc,那么所有内容都适用于您的自定义分配器。否则,你必须重写像6个操作符来分配和删除C++方法。