Visual C ++:替换malloc / free

时间:2017-04-21 14:53:43

标签: c visual-c++ malloc

我正在尝试用我自己的实现替换标准C函数。

void* malloc(size_t size) {}
void free(void*) {}

给了我以下警告/错误:

1>main.cpp(26): warning C4273: 'malloc': inconsistent dll linkage
1>  C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(97): note: see previous definition of 'malloc'
1>main.cpp(31): warning C4273: 'free': inconsistent dll linkage
1>  C:\Program Files (x86)\Windows Kits\10\Include\10.0.10240.0\ucrt\corecrt_malloc.h(85): note: see previous definition of 'free'
1>ucrtd.lib(ucrtbased.dll) : error LNK2005: _free already defined in main.obj
1>ucrtd.lib(ucrtbased.dll) : error LNK2005: _malloc already defined in main.obj
1>     Creating library ..\bin\\app.lib and object ..\bin\\app.exp
1>..\bin\\app.exe : fatal error LNK1169: one or more multiply defined symbols found

有没有办法在不使用malloc的情况下替换Visual C ++ 2015中的free / #define函数? (我使用第三方库,不想修改他们的代码)。

3 个答案:

答案 0 :(得分:3)

是的,这是可能的。这将起作用的方式是,在任何代码有机会调用这些函数之前,您的代码必须在msvcrt.dll中挂钩malloc()和free()。我相信你应该可以使用Microsoft Detours来挂钩这些功能。你也可能想在kernel32.dll中挂钩HeapAlloc()和HeapFree(),因为它们最终会调用这个API。

答案 1 :(得分:1)

假设您要调试第三方库中的内存问题,提供您自己的free()和malloc()实现并将其与您的第三方库链接将无法正常工作。

当链接器在错误消息中报告时,您有两个相同功能的实现。一个在你的文件(app.lib)中,另一个在ucrtd.dll中,它被称为Common Runtime Library,它提供了malloc()和free()。

如果从项目中删除ucrtd.dll,您将删除应用程序所需的许多其他功能。所以这可能不是一个选择。

正如Ben所提到的,如果它是用于调试内存问题,您可以使用CRT Debug Heap API,它是您通过定义一些符号(在编译时)和一些其他函数({{3)激活的内置工具}})。尽管如此,你可以挂钩内存分配过程,但是没有那么远,你可以先显示和检查很多东西。

这当然或多或少容易做,这取决于您是否可以访问您想要调试的库的源代码,这是我们不知道的。如果您无权访问源代码,则可能需要其他工具。

<强>更新 根据您是否可以访问要调试的库的来源,您可能会被此问题中引用的三种方法之一所强调:see the documentation

答案 2 :(得分:0)

即使您将/FORCE:MULTIPLE设置为链接器,也无法替换这些函数,因为它将使用第一个找到的对象。它将是CRT的实施。你真的想替换这个功能吗?如果回答是“是”,则根本不应该使用任何C运行时库函数 - 并且会有更多的痛苦(sprintf()strlen()和其他字符串功能,fopen()也使用CRT)。此外,您还应该设置项目放弃CRT。再想一想。