2012-11-29 48 views
1

嗨,这有点复杂,所以请让我知道,如果任何这没有意义,我们的团队正在编写一个C++应用程序,我们以前有运营商新重载。最近我碰到这篇文章:http://www.flipcode.com/archives/How_To_Find_Memory_Leaks.shtml关于如何获得我们的内存分配调试信息。C++重载运算符new删除,

应用的#include一个文件,我们有编译时平台配置中的所有文件,而该文件中添加以下:

#ifdef _DEBUG 
void* operator new(size_t size, const char *filename, const char *funcname, int line); 
void* operator new[](size_t size, const char *filename, const char *funcname, int line); 
#define new new(__FILE__, __FUNCSIG__, __LINE__) 
#endif 

由于我们只链接LIBCMT.LIB我们的平台编译,使用STL我删除我们的旧运营商实施新的看起来像:

// in a .cpp file: 
void* 
operator new(size_t size) { ... } 

,取而代之的是:

// in the same .cpp file as above... 
#undef new 
void* operator new(size_t size, const char *filename, const char *funcname, int line) { ... } 
#define new new(__FILE__, __FUNCSIG__, __LINE__) 

这工作正常编制,但我得到了一堆链接错误从LIBCMT.LIB:

例如:LIBCMT.LIB(malloc.obj):错误LNK2001:解析外部符号__imp_HeapAlloc

添加运算符new的旧实现(不带附加参数)可以让链接器成功链接所有内容。

我的问题:我想libcmt看到我的宏(#定义新新(FILEFUNCSIGLINE)),因此当它连接尝试和链接我定义的版本(与调试宏)。

我如何得到这个工作? (我也尝试使用visual studio中的属性表来定义宏)

+2

我认为这个库不会链接,因为它没有用你的重载'new'运算符编译。只需在自己的代码中定义一个重载的'new'就不会神奇地使它出现在预建库中。 – dreamlax

+3

正如@ dreamlax所说,这是行不通的。这是微软在MFC中的黑客攻击,应该被拿出来拍摄。如果在定义宏之后使用该关键字,则编写名称为关键字的宏会产生未定义的行为。 –

+2

@PeteBecker我宁愿用一种很好的老式圣经来抨击自己。 – WhozCraig

回答

4

你不能让它工作。如果在包含标准头的任何文件中定义了此宏,则行为是未定义的。当然,项目的正常演变将导致人们定义本地的课程operator new,或者使用新的安排,或者这个宏将破坏的许多技术中的任何一种。它与#define while if差不多。即使不使用标准库,在宏中重新定义关键字也是一个可以避免的麻烦。

+0

相关知识,谢谢! – Short