嗨,这有点复杂,所以请让我知道,如果任何这没有意义,我们的团队正在编写一个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看到我的宏(#定义新新(FILE,FUNCSIG,LINE)),因此当它连接尝试和链接我定义的版本(与调试宏)。
我如何得到这个工作? (我也尝试使用visual studio中的属性表来定义宏)
我认为这个库不会链接,因为它没有用你的重载'new'运算符编译。只需在自己的代码中定义一个重载的'new'就不会神奇地使它出现在预建库中。 – dreamlax
正如@ dreamlax所说,这是行不通的。这是微软在MFC中的黑客攻击,应该被拿出来拍摄。如果在定义宏之后使用该关键字,则编写名称为关键字的宏会产生未定义的行为。 –
@PeteBecker我宁愿用一种很好的老式圣经来抨击自己。 – WhozCraig