Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;-重写默认函数_C++_C_Visual Studio 2008_Malloc - Fatal编程技术网

C++ C/C++;-重写默认函数

C++ C/C++;-重写默认函数,c++,c,visual-studio-2008,malloc,C++,C,Visual Studio 2008,Malloc,我有以下问题: Microsoft Visual Studio(我使用的是2008 SP1)是否提供了覆盖标准C函数的方法,例如malloc,memcpy 假设我有一些外部构建的库,其中包含malloc.obj和memcpy.obj。 库名为Library.lib 我应该如何构建我的项目,以便编译器使用我的(重写的)版本的malloc()和memcpy()例程,而不是提供的那些例程(我假设它们共享相同的语法) 这件事的重点是改变我项目中的每一个malloc,而不用像my_malloc或类似的名字

我有以下问题:

Microsoft Visual Studio(我使用的是2008 SP1)是否提供了覆盖标准C函数的方法,例如
malloc
memcpy

假设我有一些外部构建的库,其中包含
malloc.obj
memcpy.obj
。 库名为
Library.lib

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

这件事的重点是改变我项目中的每一个
malloc
,而不用像
my_malloc
或类似的名字别名,这样我就可以比较性能了

这可能吗?


谢谢。

没有尝试过此操作,但是-在项目属性->链接器->输入中,将“忽略所有默认库”设置为“是”。然后设置“附加依赖项”=library.lib;libcmt.lib


这应该包括在标准静态CRT之前的库。所提供的功能链接在每种情况下都是相同的,这应该满足您的需要。尽管malloc/free如何在两个静态lib中链接到操作系统可能存在问题。我假设library.lib还重新定义了realloc/free/calloc等?

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

您最好只使用
#define
逻辑将这些函数重命名为
memcpy\u testing
malloc\u 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; }

<> p>您可以在VisualC++运行库(CRT)中建立包含代码< > MeMpY和MalCal函数(源于代码> >程序文件\微软Visual Studio 9 \ VC \CRT < /C>中的源代码。然后将您的程序与自定义CRT链接


或者,您可以使用官方文章中的技术来钩住分配函数。

查看NedMalloc的实现,这是一个自定义分配器,他似乎只是使用了#define NedMalloc malloc

头文件说它应该在windows上工作

它的开源网站上也有囤积,所以你可以看看他们是如何做到的


也有C++的问题。如果windows包含“定义新运算符”为只在下面使用malloc,则所有操作都与自定义分配器配合使用。否则,你必须像6个操作符一样来对事物进行C++的分配和删除。

显然,这个问题是可以被标记为代码> C/C++ +代码>的问题之一:这里是一个具体的问题,所以我把你的平台添加到标签中。没有标准的方法可以做到这一点(尽管有标准的方法可以做到这一点),所以这将取决于编译器和构建系统。我不同意
#define malloc(n)my_malloc(n)
会更清晰。实际上,在代码本身中执行搜索/替换会更清晰。用
#define
替换甚至可能是危险的:例如,查看代码站点,很难判断它是调用系统实现还是调用您自己的,因此很难判断使用哪个deallocator。如果针对仍然使用系统
malloc
的代码进行链接(或者如果项目的某些部分忽略了使用
#define
),则问题更大我认为我的更名想法和你的想法相反:我建议在代码中写
my_malloc
,以明确一些奇怪的事情正在发生,并在标题中写一些类似
#ifdef testing
/
#定义my_malloc(n)testing\u malloc(n)
/
\else
/
>定义my_malloc(n)malloc(n)
/
#endif
。啊,好的。是的,我同意这样更好。(我将“那些函数”解释为“
memcpy
malloc
”,而不是自定义实现。)抱歉-1,但这并不能回答问题。当需要重写CRT函数时,有很多有用的情况,但是编辑源代码是不可能的。我的设想是,MSVC标准设施不如其他系统(特别是
fopen
不支持UTF-8文件名),因此,我可以使第三方封闭源代码静态库支持Unicode文件名的唯一方法是覆盖它们使用的
fopen
。你的“备选方案”对我一点帮助都没有,尽管这正是OP所要求的。如果你这样做,那么你将失去这些库实现的所有其他功能,而不仅仅是malloc!